题目: 骑士按照下图所示的走法对棋盘进行巡逻,每个格子只允许巡逻一次,且必须巡逻所有格子。给定棋盘的行数m和列数n,输出一条骑士巡逻路径,若不存在这样一条路径,则输出impossible。 输入:输入的第一行包含一个正整数T,表示测试用例的数量。 每个测试用例的第一行都包含两个整数m和(1<=m×n<=26),表示m×n的棋盘,对行用数字(1 ~ m),对列用大写字母标识(A ~ Z)。 输出:每个测试用例的输出都以一个包含 “Scenario #i”的行开i头,其中i是从1开始的测试用例编号。然后单行输出按字典顺序排列的第1条路径,该路径访问棋盘的所以方块。应通过连接访问方块的名称输出路径,每个方块的名称都由一个大写字母后跟一个数字组成。如果不存在这样的路径,则应该在一行上输出“impossible”。在测试用例之间有一个空行。
输入样例 3 1 1 2 3 4 3 输出样例: Scenario #1: A1
Scenario #2 impossible
Scenario #3 A1B3C1A2B4C2A3B1C3A4B2C4
代码
#include<iostream>
#include<cstring>
using namespace std;
bool map[30][30],flag;
int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
int path[30][2];
int n,m;
int dfs(int x,int y,int step)
{
if(step==n*m)
return flag=1;
for(int i=0;i<8;i++)
{
int x2=x+dir[i][0];
int y2=y+dir[i][1];
if(x2>=1&&x2<=n&&y2>=1&&y2<=m&&!map[x2][y2]&&!flag)
{
map[x2][y2]=1;
path[step][0]=x2;
path[step][1]=y2;
dfs(x2,y2,step+1);
map[x2][y2]=0;
}
}
return flag;
}
int main()
{
int T;
cin>>T;
for(int k=1;k<=T;k++)
{
memset(map,0,sizeof(map));
cin>>m>>n;
flag=0;
cout<<"Scenario #"<<k<<":"<<endl;
path[0][0]=1;
path[0][1]=1;
map[1][1]=1;
if(dfs(1,1,1))
{
for(int i=0;i<m*n;i++)
cout<<char(path[i][0]+'A'-1)<<path[i][1];
cout<<endl<<endl;
}
else
cout<<"impossible"<<endl<<endl;
}
return 0;
}
|