题目大意:判断一个m*n的棋盘,能否用马步踏满
能输出字典序最小的一个
行(1,2,3.........)
列(A,B,C.......)
解题思路:用dfs遍历棋盘用v[][]记录是否踏过
用数组[][2]记录踏的顺序,如可踏满,则遍历输出即可
注意事项:输出坐标时先列后行
要字典序最小,8个方向的递归是有顺序的
编号从1开始
#include <cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int p,q;
int n[26*26+3][2]; //记录顺序
bool v[28][28]; //访问标记
bool f=0; //踏满标记
int z[8][2]={ {-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2} } ; //8个坐标
void dfs(int x,int y,int t)
{
v[x][y]=1;
n[t][0]=x;
n[t][1]=y;
if(t==p*q)
{
f=1;
return;
}
else
{
int nx,ny;
for(int i=0;i<8;++i)
{
nx=x+z[i][0];
ny=y+z[i][1];
if(nx>=0&&nx<p&&ny>=0&&ny<q&&v[nx][ny]==0)
{
dfs(nx,ny,t+1);
v[nx][ny]=0;
if(f)
return;
}
}
}
}
int main()
{
int qq;
cin>>qq;
for(int i=0;i<qq;++i)
{
cin>>p>>q;
cout<<"Scenario #"<<i+1<<":\n";
memset(v,0,sizeof(v));
f=0;
dfs(0,0,1);
if(!f)
cout<<"impossible"<<endl;
else
{
for(int i=1;i<=q*p;++i)
{
printf("%c%d",n[i][1]+'A',n[i][0]+1);
}
cout<<endl;
}
if(i!=qq-1)
cout<<endl;
}
return 0;
}