题意:马按照L形移动,求能否走过且只走过每一块。
分析:DFS深搜,不过要求字典序输出,所以定义搜索数组的时候注意顺序就OK。dfs还是不熟悉,刚开始的时候把vis数组和path数组放在dfs()的最前面,一直就WA。第一记得回溯,第二回溯的话vis和path数组必须放在for循环里。
代码:
#include<iostream> #include<cstring> using namespace std; int n,p,q; int d[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}}; int vis[100][100]; char path[1000]; int cnt,ok,flag; void dfs(int x,int y) { if(cnt==2*p*q){ ok=1; return; } for(int i=0;i<8;i++){ int dx=x+d[i][0]; int dy=y+d[i][1]; if(dx>0&&dx<=p&&dy>=0&&dy<q&&!vis[dx][dy]){ vis[dx][dy]=1; path[cnt++]=(char)(dy+65); path[cnt++]=dx+48; dfs(dx,dy); if(ok) return; vis[dx][dy]=0; cnt-=2; } } return; } int main() { cin>>n; for(int k=1;k<=n;k++){ cin>>p>>q; cout<<"Scenario #"<<k<<":"<<endl; memset(vis,0,sizeof(vis)); cnt=0,flag=0,ok=0; vis[1][0]=1; path[cnt++]='A';path[cnt++]=1+48; dfs(1,0); if(ok){ for(int u=0;u<cnt;u++) cout<<path[u]; } else cout<<"impossible"; cout<<endl<<endl; } return 0; }