Description
Input
Output
Sample Input
3 1 1 2 3 4 3
Sample Output
Scenario #1: A1 Scenario #2: impossible Scenario #3: A1B3C1A2B4C2A3B1C3A4B2C4
1 #include <cstdio> 2 #include <iostream> 3 #include <string> 4 #include <cstring> 5 //lexicographically first path 6 //题目output中出现了以上几个单词 7 //就是说骑士的移动步子是按照字典顺序来排列的 8 //首先对列进行排序较小的在前面,然后按行进行排序也是较小的在前面 9 //我构造的xy坐标是按照SDL中的图形坐标,x往下递增,y往右递增 10 //转换成数学上的xy坐标就要先对列x做排序然后再对行y做排序 11 int dirx[8]={-2,-2,-1,-1,1,1,2,2}; 12 int diry[8]={-1,1,-2,2,-2,2,-1,1}; 13 14 int T,p,q,mark[27][27]; 15 std::string way; 16 bool DFS(int x,int y,int step) 17 { 18 if(step==p*q) 19 { 20 return true; 21 } 22 for(int i=0;i<8;i++) 23 { 24 int dx=x+dirx[i]; 25 int dy=y+diry[i]; 26 if((dx>=1 && dx<=q) && (dy>=1 && dy<=p) && mark[dx][dy]!=1) 27 { 28 mark[dx][dy]=1; 29 //当找到路径才会插入操作,所以在main函数循环中不需要清空string 30 if(DFS(dx,dy,step+1)) 31 { 32 //在第0个位置插入1个字符 33 //先插入数字然后再插入字母,否则顺序颠倒 34 way.insert(0,1,dy+'0'); 35 way.insert(0,1,dx+'A'-1); 36 return true; 37 } 38 mark[dx][dy]=0; 39 } 40 } 41 return false; 42 } 43 int main() 44 { 45 scanf("%d",&T); 46 for(int i=1;i<=T;i++) 47 { 48 scanf("%d%d",&p,&q); 49 way.clear();//每次都要清空string 50 bool find=false; 51 for(int x=1;x<=q && !find;x++) 52 { 53 for(int y=1;y<=p;y++) 54 { 55 memset(mark,0,sizeof(mark)); 56 mark[x][y]=1; 57 if(DFS(x,y,1)) 58 { 59 //找到的话插入起始位置 60 way.insert(0,1,y+'0'); 61 way.insert(0,1,x+'A'-1); 62 find=true; 63 break; 64 } 65 } 66 } 67 std::cout<<"Scenario #"<<i<<":"<<std::endl; 68 if(find) 69 { 70 //整体输出就行 71 std::cout<<way<<std::endl<<std::endl; 72 } 73 else 74 printf("impossible\n\n"); 75 } 76 return 0; 77 }