1. 程式人生 > >POJ 2488 A Knight's Journey-dfs

POJ 2488 A Knight's Journey-dfs

tar number size 關於 target 圖解 ems pri using

題目鏈接: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("\n"); 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:\n",cnt++); 40 vis[1][1]=1; 41 dfs(1,1,1); 42 if(flag==0) 43 printf("impossible\n"); 44 printf("\n"); 45 } 46 return 0; 47 }

POJ 2488 A Knight's Journey-dfs