POJ 2488 A Knight's Journey-dfs
Posted ljhaha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2488 A Knight's Journey-dfs相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=2488
题目解读:首先得弄清楚国际象棋中关于“马走日”的规则,如上图中的马,它的下一步的走法有8中,所以对每一个位置的马,它所能走的8个方向坐标设置为
dir[8][2]= {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
对于最后一组测试案例4 3
画出图解如下:
解题代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 int vis[100][100]; 7 int p,q,flag; 8 int dir[8][2]= {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}}; 9 struct node{ 10 int x,y; 11 }a[100]; 12 void dfs(int x,int y,int step) 13 { 14 a[step].x=x; a[step].y=y; 15 if(step==p*q){ 16 for(int i=1;i<=step;i++) 17 printf("%c%d",a[i].y-1+‘A‘,a[i].x); 18 printf(" "); 19 flag=1; 20 } 21 if(flag) return; 22 for(int i=0;i<8;i++){ 23 int xx=x+dir[i][0]; 24 int yy=y+dir[i][1]; 25 if(xx>0&&xx<=p &&yy>0&&yy<=q && vis[xx][yy]==0){ 26 vis[xx][yy]=1; 27 dfs(xx,yy,step+1); 28 vis[xx][yy]=0; 29 } 30 } 31 } 32 int main() 33 { 34 int T,cnt=1;scanf("%d",&T); 35 while(T--){ 36 flag=0; 37 memset(vis,0,sizeof(vis)); 38 scanf("%d%d",&p,&q); 39 printf("Scenario #%d: ",cnt++); 40 vis[1][1]=1; 41 dfs(1,1,1); 42 if(flag==0) 43 printf("impossible "); 44 printf(" "); 45 } 46 return 0; 47 }
以上是关于POJ 2488 A Knight's Journey-dfs的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2488-A Knight's Journey(DFS)
poj-2488 a knight's journey(搜索题)