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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值