poj 2488 A Knight's Journey
阿新 • • 發佈:2018-12-15
題意:給出一個國際棋盤的大小 p*q,判斷馬能否不重複的走過所有格,並記錄下其中按字典序排列的第一種路徑。
因為要求字典序輸出最小,所以按下圖是搜尋的次序搜素出來的就是最小的。
初始方向陣列:int f[2][8]={{-2,-2,-1,-1, 1,1, 2,2}, {-1, 1,-2, 2,-2,2,-1,1}};
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int q,p,vis[30][30],flag; int f[2][8]={{-2,-2,-1,-1, 1,1, 2,2}, {-1, 1,-2, 2,-2,2,-1,1}}; struct node{ int x,y; }mp[30]; void dfs(int x,int y,int step,int t) { if(flag) return; vis[x][y]=1; mp[step].x=x; mp[step].y=y; if(step==p*q&&flag==0) { flag=1; printf("Scenario #%d:\n",t); for(int i=1;i<=step;i++) { char c = mp[i].x-1+'A'; cout<<c<<mp[i].y; } printf("\n\n");return; } for(int i=0;i<8;i++) { int nx = x+f[0][i]; int ny = y+f[1][i]; if(!vis[nx][ny] && nx>=1 && nx<=q && ny>=1 && ny<=p) dfs(nx,ny,step+1,t); } vis[x][y]=0; } int main() { int T;cin>>T; for(int i=1;i<=T;i++) { cin>>p>>q; memset(vis,0,sizeof(vis)); flag=0; dfs(1,1,1,i); if(!flag) { printf("Scenario #%d:\nimpossible\n\n",i); } } return 0; }