POJ-2488

第一道DFS,对DFS有了一个大概的了解
1.用一个数组定义方向,这样的话可以依照字符串顺序来进行搜索。
2.dfs这个函数是模拟的放下棋子后的判断,而在dfs前后进行放祺和回溯(撤棋)
3.dfs走到最后,要么flag=1成功,要么失败,所以直接默认失败就好了。
4.在dfs开头先判断是否已经成功,再判断是否成功(我觉得反过来也可以),在进行操作。
5.ans数组来储存答案,如果失败不用再“清零”,因为后面的正确答案可以自动覆盖。
6.dfs还有一个参数step,这里看着很重要,不知道后面这个参数起到什么作用。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;

int cb[27][27];
int flag=0,ct=0,p,q;
int ans[27][2]={0};
int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};

void build(int p,int q)
{
    for (int i=1;i<=q;i++)
        for(int j=1;j<=p;j++)
    {
        cb[i][j]=0;
    }
    return ;
}


void dfs(int x,int y,int step)
{
    if(flag)
        return;
    ans[step][0]=x;
    ans[step][1]=y;
//    printf("%c%d\n",'A'+ans[step][0]-1,ans[step][1]);
    if(step==p*q)
    {
//        printf("step=p*q\n");
        flag=1;
        return;
    }
    else
    {
        for(int i=0;i<8;i++)
        {
            int nx,ny;
            nx=x+dir[i][0];
            ny=y+dir[i][1];
//            printf("%d %d\n" ,q,p);
            if(nx>0&&ny>0&&nx<=q&&ny<=p&&cb[nx][ny]==0)
            {
//                    printf("%c%d\n",'A'+ans[step][0]-1,ans[step][1]);
//
//                printf("search further\n");
                cb[nx][ny]=1;
                dfs(nx,ny,step+1);
                cb[nx][ny]=0;
            }
        }
    }
    return;
}



int main(void)
{
    int n;
    scanf("%d",&n);
    for(int j=1;j<=n;j++)
    {
        scanf("%d %d",&p,&q);
        build(p,q);
        memset(ans,0,27*2*sizeof(int));
        ct=0;
        flag=0;
        cb[1][1]=1;
        dfs(1,1,1);
        printf("Scenario #%d:\n",j);
        if(!flag)
        {
            printf("impossible\n\n");
        }
        else
        {
            for(int i=1;i<=p*q;i++)
                printf("%c%d",'A'+ans[i][0]-1,ans[i][1]);
            printf("\n\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值