上一次做八数码的时候,自己把不输出路线的版本写了出来,对于记录路线的,也没去想怎么写,今天做到一个记录路线的dfs,正好写出来
这个代码中记录路线的办法非常清晰易懂,看了就会:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct aa{ int x; int y; }; bool markk; aa qq[30]; int h,l,sum; int v[30][30]; int movee[][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}}; void dfs(int hh,int ll,int num){ qq[num].x=hh; qq[num].y=ll; if(num==sum){ markk=true; return; } int tx,ty; for(int i=0;i<8;i++){ ty=ll+movee[i][1]; tx=hh+movee[i][0]; if(v[tx][ty]||tx<=0||tx>h||ty<=0||ty>l||markk) continue; v[tx][ty]=1; dfs(tx,ty,num+1); v[tx][ty]=0; } return; } int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ markk=false; memset(v,0,sizeof(v)); cin>>h>>l; sum=h*l; v[1][1]=1; dfs(1,1,1); printf("Scenario #%d: ",i); if(markk){ for(int i=1;i<=l*h;i++){ printf("%c",qq[i].y+64);cout<<qq[i].x; } cout<<endl; } else cout<<"impossible "; cout<<endl; } return 0; }