给出棋盘,要求判断马能否只经过每个格子一次并走完全部格子 要求字典序输出
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<string.h>
#include<cstring>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<ctime>
#include<queue>
#define hash hashh
using namespace std;
typedef long long ll;
#define sp system("pause");
int n,m;
int flag = 0;
int vis[30][30];
int dir[][2]={-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2};
char s[30*30*3];
bool isLegal(int x,int y)
{
if(x >= 0 && x < n && y >= 0 && y < m)
return 1;
return 0;
}
void dfs(int px,int py,int num,char *s)
{
int pp,qq;
if(flag)
return ;
if(num == n * m * 2)
{
flag = 1;
puts(s);
return;
}
for(int i = 0; i < 8; ++i)
{
pp = px + dir[i][0];
qq = py + dir[i][1];
if(isLegal(pp,qq) && !vis[pp][qq])
{
vis[pp][qq] = 1;
s[num] = 'A' + qq;
s[num + 1] = '1' + pp;
dfs(pp,qq,num+2,s);
if(flag)return;
vis[pp][qq] = 0;
}
}
}
int main()
{
int t;
cin >> t;
for(int cas = 1; cas <= t; ++cas)
{
cin >> n >> m;
cout<<"Scenario #"<<cas<<":"<<endl;
memset(vis,0,sizeof(vis));
memset(s,0,sizeof(s));
flag = 0;
for(int j = 0;j < m; ++j)
{
for(int i = 0; i < n; ++i)
{
s[0] = 'A' + j;
s[1] = '1' + i;
vis[i][j] = 1;
dfs(i,j,2,s);
if(flag)
break;
vis[i][j] = 0;
}
if(flag)
break;
}
if(flag == 0)
puts("impossible");
printf("\n");
}
return 0;
}