刚开始读题的时候不小心,认为只要深搜就ok了,交了之后一直wa。
看了discuss才知道读题不小心,原来是要按字典序顺序(刚开始有注意到那个陌生单词,不知道什么意思,就忽略了……>_<...没文化真可怕啊)。我把遍历节点的两层循环改为外层循环列,内层循环行,之后提交,依旧wa。
自后才想到对每个位置周围的可走的八个位置搜索是有先后顺序的,应该按照列值由小到大的顺序,改了之后ac了。
#include<stdio.h>
int a[30][30];
int vis[30][30];
int x[30], y[30];
int tx[10] = {-1, 1, -2, 2, -2, 2, -1, 1},
ty[10] = {-2, -2, -1, -1, 1, 1, 2, 2};
int p, q, tmp;
int dfs(int i, int j, int step)
{
x[step] = i;
y[step] = j;
vis[i][j] = 1;
if(step == p*q)
return 1;
int px, py;
for(int k=0; k<8; k++)
{
px = i + tx[k];
py = j + ty[k];
if(!vis[px][py] && px>=0 && px<p && py>=0 && py<q)
if(dfs(px, py, step+1))
return 1;
}
vis[i][j] = 0;
return 0;
}
int solve()
{
for(int k=0; k<30; k++) {
for(int l=0; l<30; l++) {
vis[k][l] = 0;
}
}
for(int j=0; j<q; j++)
{
for(int i=0; i<p; i++)
{
if(dfs(i, j, 1))
{ return 1; }
}
}
return 0;
}
int main()
{
int n;
scanf("%d", &n);
for(int t=1; t<=n; t++)
{
scanf("%d %d", &p, &q);
int r = solve();
printf("Scenario #%d:\n", t);
if(r) {
for(int i=1; i<=p*q; i++)
{
printf("%c%d", 'A'+y[i], x[i]+1);
}
} else {
printf("impossible");
}
printf("\n\n");
}
return 0;
}