poj 2488 A Knight's Journey( dfs )
题目:http://poj.org/problem?id=2488
题意:
给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<stack> 6 #include<queue> 7 #include<iomanip> 8 #include<cmath> 9 #include<map> 10 #include<vector> 11 #include<algorithm> 12 using namespace std; 13 14 struct node 15 { 16 int x,y; 17 }q[30]; //记录路径 18 int p,c; 19 int vis[300][30]; 20 int d[10][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//顺序很重要,不能改变 21 int dfs(int i,int j,int step) 22 { 23 vis[i][j]=1; 24 q[step].x=i; 25 q[step].y=j; 26 if(step==p*c) return 1; 27 for(int k=0; k<8; k++) 28 { 29 int a=i+d[k][0]; 30 int b=j+d[k][1]; 31 if(!vis[a][b]&&a>=1&&a<=p&&b>=1&&b<=c) 32 if(dfs(a,b,step+1)) 33 return 1; 34 } 35 vis[i][j]=0; 36 return 0; 37 } 38 int main() 39 { 40 int t,i; 41 cin>>t; 42 for(i=1; i<=t; i++) 43 { 44 memset(vis,0,sizeof(vis)); 45 cin>>p>>c; 46 printf("Scenario #%d:\n",i); 47 if(dfs(1,1,1)) 48 { 49 for(int j=1; j<=p*c; j++) 50 printf("%c%d",q[j].y+64,q[j].x); 51 cout<<endl<<endl; 52 } 53 else 54 cout<<"impossible"<<endl<<endl; 55 } 56 return 0; 57 }