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

来源:互联网 发布:c 控制台界面编程 编辑:程序博客网 时间:2024/06/05 18:42

刚开始读题的时候不小心,认为只要深搜就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;}