2016蓝桥杯C/C++省赛 卡片换位(深搜DFS)

题目:


思路:

这题麻烦的一点在于处理输入和标记状态,以空格为点走,如果下一步是A点那么就让A走一格和空格换位,对于B点同理。注意在搜索的时候注意返回条件和判断是否越界

代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define M 1000000+10
#define ll long long
using namespace std;
int go[4][2]= {0,1,0,-1,1,0,-1,0};//方向向量
int minn=inf;
int vis[3][3][3][3][3][3];//标记数组
struct node
{
    int x;
    int y;
} a,b,k;//分别记录a,b和空格的坐标
void input()//处理输入
{
    char s;
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<3; j++)
        {
            s=getchar();
            if(s==' ')
            {
                k.x=i;
                k.y=j;
            }
            if(s=='A')
            {
                a.x=i;
                a.y=j;
            }
            if(s=='B')
            {
                b.x=i;
                b.y=j;
            }
        }
        getchar();
    }
}
void dfs(int x1,int y1,int x2,int y2,int x,int y,int step)
{
    if(step>minn)
        return;
    if(x1==b.x&&y1==b.y&&x2==a.x&&y2==a.y)
    {
        minn=min(minn,step);
        return;
    }
    //判断越界
    if(x<0||x>1||y<0||y>2)
        return;
    if(x1<0||x1>1||y1<0||y1>2)
        return;
    if(x2<0||x2>1||y2<0||y2>2)
        return;
    if(vis[x1][y1][x2][y2][x][y]==1)
        return;
    
    vis[x1][y1][x2][y2][x][y]=1;//标记
    for(int i=0; i<4; i++)
    {
        int xx=x+go[i][0];
        int yy=y+go[i][1];
        if(xx==x1&&yy==y1)
            dfs(x,y,x2,y2,x1,y1,step+1);
        else if(xx==x2&&yy==y2)
            dfs(x1,y1,x,y,x2,y2,step+1);
        else
            dfs(x1,y1,x2,y2,xx,yy,step+1);
    }
    vis[x1][y1][x2][y2][x][y]=0;
}
int main()
{
    mem(vis,0);
    input();
    dfs(a.x,a.y,b.x,b.y,k.x,k.y,0);
    printf("%d\n",minn);
    return 0;
}

PS:惭愧啊。。这题找了3个小时Bug结果是一个判断越界的条件没加导致程序一直崩找不到原因,以后要注意心细一点。。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值