题目大意:按照国际象棋骑士的走法,要你让骑士能够遍历每个棋盘的格子,按照字典序输出走法,没有则输出impossible
解题思路:深度优先遍历,因为要按字典序输出,所以,深度遍历时要按照一定的方向进行遍历
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 27;
struct node
{
char str;
int num;
}result[maxn*maxn];
bool map[maxn][maxn];
int dirc[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
int n, p, q, ans;
bool dfs(int x, int y);
int main()
{
scanf("%d", &n);
int t = 1;
while(n-- != 0)
{
memset(map, 0, sizeof(map));
ans = 0;
scanf("%d %d", &p, &q);
printf("Scenario #%d:\n", t++);
if(dfs(0,0))
{
for(int i = 0; i < ans; i++)
printf("%c%d", result[i].str, result[i].num);
printf("\n");
}
else
printf("impossible\n");
printf("\n");
}
return 0;
}
bool dfs(int x, int y)
{
if(x >= 0 && x < q && y >= 0 && y < p && !map[x][y])
{
result[ans].str = 'A' + x;
result[ans].num = y + 1;
ans++;
map[x][y] = true;
}
else
return false;
if(ans == p * q)
return true;
for(int i = 0; i < 8; i++)
{
int dx = x + dirc[i][0];
int dy = y + dirc[i][1];
if(dfs(dx, dy))
return true;
}
map[x][y] = false;
ans--;
return false;
}