poj2488A Knight's Journey--简单搜索

来源:互联网 发布:cms 系统 小程序 编辑:程序博客网 时间:2024/06/01 13:24

题目大意:一个p*q的棋盘,骑士走日字,看是否能不重复的遍历棋盘,如果能,输出字典序。题目里p是数字,q是字母,遍历字典序要根据q来排列。

这里个题目花了些时间,一是在这里,二是没有注意找到就退出。


#include<cstdio>
#include<cstring>
const int N=27;
int vis[N][N],p,q,nm;
//x 数字 y字母,按照y从小到大扩展 
int fx[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
int pathx[2*N],pathy[2*N];
bool flag;
int  dfs(int x,int y,int step){   
    if(step==nm){
  flag=true;
  return 1 ; //这里的退出不是找到就退出,还要找其他方案,
  }
else  
for(int i=0;i<8;i++){
 int tmpx=x+fx[i][0],tmpy=y+fx[i][1];
 if(tmpy>=0&&tmpy<p&&tmpx>=0&&tmpx<q&&!vis[tmpx][tmpy]){
vis[tmpx][tmpy]=1;
pathx[step]=tmpx;
       pathy[step]=tmpy;   
dfs(tmpx,tmpy,step+1);
if(flag)return 1;//搜索,找到一个就退出,不再往下进行。 
vis[tmpx][tmpy]=0;
 }
   }
}
int main(){
int t,i;
scanf("%d",&t);
for(i=1;i<=t;i++){
 flag=false;
 memset(vis,0,sizeof(vis));
 scanf("%d%d",&p,&q);
 printf("Scenario #%d:\n",i);
 nm=p*q;
 vis[0][0]=1;
 pathx[0]=0;
 pathy[0]=0;
 dfs(0,0,1);
 if(flag)
     {
      for (int j=0;j<nm;j++)
        printf("%c%c",pathx[j]+'A',pathy[j]+'1');
      printf("\n\n") ;
 }
 else printf("impossible\n\n");
   }
return 0;
}


0 0
原创粉丝点击