DFS基礎題,題目大意是給出棋盤大小,問馬能否走遍所有的格子。
需要注意的是,題目要求按字典序輸出路徑,所以遍曆時,要按照先從上到下再由左至右的順序。這裡開始把往上和往下的順序搞反了。。一直WA。。還是太年輕。代碼有些細節寫得醜,大概就是這樣。
#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;int a[40][40];int p,q;int row[40],col[40],step=0;int xr[]={-1,1,-2,2,-2,2,-1,1};int yr[]={-2,-2,-1,-1,1,1,2,2};void dfs(int x,int y){ if(x<1 || x>p || y<1 || y>q) return ; //遞迴邊界 if(a[x][y]== 1) return ; //遞迴邊界 row[++step]=x; col[step]=y; a[x][y]=1; for(int i=0;i<8;i++){ int xx=x+xr[i]; int yy=y+yr[i]; dfs(xx,yy); } if(step==p*q) return ; a[x][y]=0; step--;}int main(){ // freopen("in.txt","r",stdin); int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&p,&q); for(int j=1;j<=q;j++){ for(int k=1;k<=p;k++){ //注意行列的順序 memset(a,0,sizeof(a)); step=0; dfs(k,j); if(step==p*q)break; } if(step==p*q)break; } printf("Scenario #%d:\n",i); if(step==p*q){ for(int j=1;j<=step;j++) printf("%c%d",col[j]+'A'-1,row[j]); printf("\n\n"); } else printf("impossible\n\n"); } return 0;}