题目大意:
给一个棋盘的长和宽,让你选择一条路径,可以让“马”走完整个棋盘。
做法:
遍历棋盘的每一个点作为起点。
从起点开始,dfs每条可能的路径。
由于当存在多条路径的时候,输出字典序小的那条路径,所以,在dfs的时候,一定要先遍历字典序小的路径。
当遍历到一条可行路径的时候输出这条路径。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int map[100][100];
int num[100];
int st,end;
int a,b;
int leap;
int xx[8]={-1,1,-2,2,-2,2,-1,1};
int yy[8]={-2,-2,-1,-1,1,1,2,2};
int pan()
{int i,j;for(i=1;i<=a;i++){for(j=1;j<=b;j++){if(map[i][j]==0)return 0;}}return 1;
}
void print(int x)
{int i;int aa,bb;for(i=1;i<x;i++){aa=num[i]%b;if(aa==0)aa=b;bb=(num[i]-aa)/b+1;// printf("%d %d\n",b,a);printf("%c%c",aa+'A'-1,bb+'0');}printf("\n");
}
void search(int x,int y,int z)
{if(x<1||y<1||x>a||y>b){if(pan()){print(z);leap=1;return ;}elsereturn ;}if(map[x][y]!=0)return ;map[x][y]=z;num[z]=(x-1)*b+y;int i;for(i=0;i<8;i++){search(x+xx[i],y+yy[i],z+1);if(leap==1)return ;}map[x][y]=0;
}
int main()
{int i,j,k,n;cin>>n;for(k=0;k<n;k++){memset(map,0,sizeof(map));cin>>a>>b;printf("Scenario #%d:\n",k+1);for(i=1;i<=b;i++){for(j=1;j<=a;j++){leap=0;memset(num,0,sizeof(num));memset(map,0,sizeof(map));search(j,i,1);if(leap)break;}if(j!=a+1)break;}if(i==b+1)printf("impossible\n");printf("\n");}return 0;
}