您的位置:首页 > 其它

poj2488--------------深搜(注意字典序)

2013-01-11 20:36 260 查看
刚开始读题的时候不小心,认为只要深搜就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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: