#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int visit[27][27];
int p, q;
int testcase;
int count;
int direction[8][2] = {{-1, -2},
{1, -2},
{-2, -1},
{2, -1},
{-2, 1},
{2, 1},
{-1, 2},
{1, 2}};
struct Point {
char sym;
int ix;
Point(int x, int y) {
ix = x;
sym = static_cast<char>(y - 1 + 'A');
}
};
vector<Point> vector1;
void printvec() {
for (int k = 0; k < vector1.size(); ++k) {
cout << vector1[k].sym << vector1[k].ix;
}
cout << endl;
}
bool isin(int x, int y) {
return x > 0 && x <= p && y > 0 && y <= q;
}
void dfs(int x, int y) {
// 共有八种移动方法
if (count == p * q) {
throw "error";
}
for (int k = 0; k < 8; ++k) {
int xx = x + direction[k][0];
int yy = y + direction[k][1];
if (!visit[xx][yy] && isin(xx, yy)) {
visit[xx][yy] = 1;
count++;
vector1.push_back(Point(xx, yy));
dfs(xx, yy);
vector1.pop_back();
count--;
visit[xx][yy] = 0;
}
}
}
int main() {
int num = 1;
// freopen("../in.txt", "r", stdin);
scanf("%d", &testcase);
while (testcase--) {
memset(visit, 0, sizeof(visit));
vector1.clear();
scanf("%d %d", &p, &q);
bool flag = false;
count = 1;
visit[1][1] = 1;
vector1.push_back(Point(1, 1));
try {
dfs(1, 1);
} catch (...) {
flag = true;
}
cout <<"Scenario #"<<num<<":"<< endl;
num++;
if (flag) {
printvec();
} else {
cout << "impossible" << endl;
}
cout << endl;
}
}
POJ 2488
最新推荐文章于 2019-04-20 18:35:43 发布