题目地址
这道题似乎在哪里见过呀,这不是我洛谷好久不见的老朋友吗,这么简单的模拟看我不手到擒来,额。。。。。好吧当我没说过这句话,没关系,反正我会CV大法,看我不分分钟秒了你,小东西,哎呀美好的一天到此结束了。事情真的有这么简单吗?然我们拭目以待。
什么东西,洛谷上不是AC了吗,该不会样例有问题吧,好吧,模拟反正我也懒得想了,那就简单来个搜索吧,应该不会超时吧。
#include
using namespace std;
int a[110][110];
int n,m;
int dir[4][2]={
{0,1},
{1,0},
{0,-1},
{-1,0}
};
bool check(int i,int j){
if(i<1||i>n)
return false;
if(j<1||j>m)
return false;
if(a[i][j]!=0)
return false;
return true;
}
void dfs(int i,int j,int t){
if(t>n*m){
return;
}
a[i][j]=t;
for(int k=0;k<4;k++){
int di = i+dir[k][0];
int dj = j+dir[k][1];
if(check(di,dj)){
dfs(di,dj,t+1);
}
}
}
int main(){
cin>>n>>m;
dfs(1,1,1);
for(int i = 1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
这么离谱的吗?
好吧我发现一个问题就是这样递归并不满足题意,比如在向上搜索的时候如果右边可以搜索的话他会优先搜索右边并不会一条路走到尽头,嘻嘻嘻,这还不简单我让它沿着一条路走完再转弯不就OK了,机智如我,于是我在程序里加了这么一段代码,记录它上一次搜索的方向如果这一次这个方向还满足条件的话就继续往这个方向走
if(check(i+dir[f][0],j+dir[f][1])){
dfs(i+dir[f][0],j+dir[f][1],t+1,f);
#include
using namespace std;
int a[110][110];
int n,m;
int dir[4][2]={
{0,1},
{1,0},
{0,-1},
{-1,0}
};
bool check(int i,int j){
if(i<1||i>n)
return false;
if(j<1||j>m)
return false;
if(a[i][j]!=0)
return false;
return true;
}
void dfs(int i,int j,int t,int f){
if(t>n*m){
return;
}
a[i][j]=t;
if(check(i+dir[f][0],j+dir[f][1])){
dfs(i+dir[f][0],j+dir[f][1],t+1,f);
}
for(int k=0;k<4;k++){
int di = i+dir[k][0];
int dj = j+dir[k][1];
if(check(di,dj)){
dfs(di,dj,t+1,k);
}
}
}
int main(){
cin>>n>>m;
dfs(1,1,1,0);
for(int i = 1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]<10){
cout<<" ";
}
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
终于一波三折总算是AC了,在见了。