原题链接:http://poj.org/problem?id=2488
分析:如果存在合法路径,那么一定可以将路径的起始点定为(A,1),从该点按字典序DFS,如果找到一条路径,那么这条路即为所求。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #define maxn 27 6 using namespace std; 7 int dirx[8]={-2,-2,-1,-1,1,1,2,2}; 8 int diry[8]={-1,1,-2,2,-2,2,-1,1}; 9 char path[maxn<<1]; 10 int p,q,tot; 11 bool visit[maxn][maxn],flag; 12 void print() 13 { 14 for(int i=0;i<2*tot;i++) 15 printf("%c",path[i]); 16 printf(" "); 17 } 18 void dfs(int num,int x,int y) 19 { 20 if(num==tot){ 21 print(); 22 flag=true; 23 return; 24 } 25 for(int i=0;i<8&&!flag;i++){ 26 int nx=x+dirx[i]; 27 int ny=y+diry[i]; 28 if(nx>0&&ny>0&&nx<=q&&ny<=p&&!visit[nx][ny]){ 29 visit[nx][ny]=true; 30 path[num<<1]=nx+'A'-1; 31 path[num<<1|1]=ny+'1'-1; 32 dfs(num+1,nx,ny); 33 visit[nx][ny]=false; 34 } 35 } 36 } 37 int main() 38 { 39 int T,cas=1; 40 scanf("%d",&T); 41 while(T--) 42 { 43 scanf("%d%d",&p,&q); 44 memset(visit,false,sizeof(visit)); 45 tot=p*q;flag=false; 46 path[0]='A';path[1]='1'; 47 printf("Scenario #%d: ",cas++); 48 visit[1][1]=true; 49 dfs(1,1,1); 50 if(!flag)printf("impossible "); 51 if(T)puts(""); 52 } 53 return 0; 54 }