/*
p 横
q 竖
顺序...
这题要按照字典序顺序搜索,深搜策略,判断成功的条件是走的步数等于格子的数目
*/
#include
<
stdio.h
>
#include
<
string
.h
>
#define
MAXN 27
int
map[MAXN][MAXN];
int
p, q, cas, ok, step;;
int
pathX[MAXN], pathY[MAXN];
int
dr[
8
][
2
]
=
{{
-
2
,
-
1
}, {
-
2
,
1
}, {
-
1
,
-
2
}, {
-
1
,
2
},{
1
,
-
2
}, {
1
,
2
}, {
2
,
-
1
}, {
2
,
1
}};
//
字典序顺序
int
legal(
int
x,
int
y){
if
(x
<=
0
||
y
<=
0
||
x
>
p
||
y
>
q)
return
0
;
return
1
;
}
void
DFS(
int
x,
int
y){
if
( ok )
return
;
pathX[step]
=
y;
pathY[step]
=
x;
step
++
;
if
(step
==
p
*
q){
ok
=
1
;
return
;
}
int
d;
map[x][y]
=
1
;
for
(d
=
0
; d
<
8
;
++
d){
int
newx
=
x
+
dr[d][
1
], newy
=
y
+
dr[d][
0
];
if
(legal(newx, newy)
&&
!
map[newx][newy] ){
DFS(newx, newy);
step
--
;
}
}
map[x][y]
=
0
;
}
void
preProcess(){
printf(
"
Scenario #%d:\n
"
,
++
cas);
memset(map,
0
,
sizeof
(map));
ok
=
0
;
step
=
0
;
}
void
printPath(){
int
i;
for
(i
=
0
; i
<
p
*
q;
++
i){
printf(
"
%c%d
"
,pathX[i]
+
'
A
'
-
1
, pathY[i]);
}
printf(
"
\n
"
);
}
int
main(){
int
n, i;
scanf(
"
%d
"
,
&
n);
for
(i
=
1
; i
<=
n;
++
i){
preProcess();
scanf(
"
%d %d
"
,
&
p,
&
q);
DFS(
1
,
1
);
if
( ok ){
printPath();
}
else
{
printf(
"
impossible\n
"
);
}
if
(i
!=
n)
printf(
"
\n
"
);
}
return
0
;
}