题目描述:若骑士所处位置为图中马所在的位置,则他可以往图中白点处走
要求:
1第一行首先给出一个整数,表示要测试的数据组数,接下来每一行包含两个整数,第一个整数为矩阵的行数,第二个数为矩阵的列数,矩阵的行从第一行开始依次标记为1,2,....列数从第一列开始依次标记为A,B,C......。
2.骑士从左上角那个点处开始走,判断骑士是否可以遍历矩阵中的所有点,如果可以,请输出字典序最小的路径(路径记录的是当前骑士所在的位置)。如果不可以,请输出“impossible”。
样例输入:
3 1 1 2 3 4 3样例输出:
Scenario #1: A1 Scenario #2: impossible Scenario #3: A1B3C1A2B4C2A3B1C3A4B2C4
题目分析:
该题是一道基础的深搜题,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include<iostream> #include<cstring> using namespace std; //book用于记录当前位置 int a[30][30],step[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}},m,n,book[300000][2];//枚举出骑士走的方向(注意按字典序大小枚举) bool flag=0; void dfs(int x,int y,int t) { if(t==(m*n)) //判断是否所有格子均被遍历过 { flag=1; return; } if(flag==1) return; //已经找到答案的话直接返回 for(int i=0;i<8;i++) //遍历八个方向 { int tx=x+step[i][0],ty=y+step[i][1]; if(a[tx][ty]==1) { a[tx][ty]=0; //走过的格子就不能再走,所以被标记为0 book[t][0]=tx; //记录当前格子 book[t][1]=ty; dfs(tx,ty,t+1); //继续搜索 if(flag==1) //若已找到答案,跳出循环 break; a[tx][ty]=1; //若此路不通,则将当前格子回溯 } } return; } void print() { for(int i=0;book[i][1]!=0;i++) { cout<<(char)(book[i][1]-1+'A')<<book[i][0]; } cout<<endl; return; } int main() { int x; cin>>x; for(int i=1;i<=x;i++) { flag=0; //flag用于记录是否找到走完全图的最小字典序路径 memset(a,0,sizeof(a)); memset(book,0,sizeof(book)); cin>>m>>n; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) a[i][j]=1; //将图中可以走的地方标记一下 a[1][1]=0; dfs(1,1,1); //3个参数,x,y为当前位置坐标,t为已经走过的格子数 book[0][0]=1; book[0][1]=1; cout<<"Scenario #"<<i<<":"<<endl; if(flag==1) { print(); //打印出答案(若存在的话) } else cout<<"impossible"<<endl; //否则输出impossible cout<<endl; } } |