#include <stdio.h> #define MAX 27 void dfs(int i, int j); int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1}; int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2}; int marked[MAX][MAX]; //标记 int pathx[MAX]; int pathy[MAX]; int flag, step; int p,q; int main(void) { int n; int i = 0; int j, k; scanf("%d", &n); while (i++ < n) { scanf("%d%d", &p, &q); for (j = 1; j <= p; j++) { for (k = 1; k <= q; k++) marked[j][k] = 0; } flag = 0; step = 0; dfs(1, 1); //从(A, 1)开始搜索 printf("Scenario #%d: ", i); if (flag) { for (j = 1; j <= p * q; j++) printf("%c%d", pathy[j] + 'A' - 1, pathx[j]); printf(" "); } else printf("impossible "); printf(" "); } } void dfs(int i, int j) { int x, y; int k; if (flag == 1) return; marked[i][j] = 1; //标记 step++; pathx[step] = i; pathy[step] = j; if (step == p * q) { flag = 1; return; } //注意:二维数组和棋盘的坐标x, y是反的 for (k = 0; k < 8; k++) { x = i + dx[k]; y = j + dy[k]; if (marked[x][y] != 1 && x <= p && x>= 1 && y <= q && y >= 1) { dfs(x, y); step--; //走错了回退时步数-1 } } marked[i][j] = 0; //撤销标记 }