dfs。
#include<iostream>
#include<cstring>
using namespace std;
const int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
const int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
int n;
int c = 1;
int p, q;
bool vis[31][31];
int cnt;
int path[31 * 31][2];
bool flag;
void dfs(int x, int y)
{
if(cnt == p * q)
{
flag = true;
return;
}
int nxt_x, nxt_y;
for(int i = 0; i < 8; i ++)
{
nxt_x = x + dx[i];
nxt_y = y + dy[i];
if(nxt_x < 0 || nxt_x >= p || nxt_y < 0 || nxt_y >= q || vis[nxt_x][nxt_y])
continue;
vis[nxt_x][nxt_y] = true;
path[cnt][0] = nxt_x;
path[cnt][1] = nxt_y;
cnt ++;
dfs(nxt_x, nxt_y);
if(flag)
return;
vis[nxt_x][nxt_y] = false;
cnt --;
}
}
int main()
{
cin >> n;
for(; c <= n; c ++)
{
memset(vis, false, sizeof(vis));
cnt = 0;
flag = false;
cin >> p >> q;
vis[0][0] = true;
path[0][0] = path[0][1] = 0;
cnt ++;
dfs(0, 0);
if(!flag)
cout << "Scenario #" << c << ":\nimpossible\n\n";
else
{
cout << "Scenario #" << c << ":\n";
for(int i = 0; i < p * q; i ++)
cout << char('A' + path[i][1]) << 1 + path[i][0];
cout << "\n\n";
}
}
// system("pause");
return 0;
}