蓝桥杯卡片换位(DFS)

这个题想了大约一天,想写总是少点东西,所以借鉴了很多别人的代码,这个是第一个弄懂的,先转过来,免得到时候又忘记了

 #include "StdAfx.h"
    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    #define inf 0x3f3f3f3f
    int minn=inf;
    using namespace std;
    int go[4][2]= {0,1,0,-1,1,0,-1,0};//方向向量
    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)//x1y1到达b x2y2到达a 难道xy是空格?
        {
            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)//新的一步走到了A处
                dfs(x,y,x2,y2,x1,y1,step+1);//int x1,int y1,int x2,int y2,int x,int y,int step  走到A处,xy和A直接交换位置带入
            else if(xx==x2&&yy==y2)
                dfs(x1,y1,x,y,x2,y2,step+1);//走到B处,xy和B交换带入
            else
                dfs(x1,y1,x2,y2,xx,yy,step+1);//和AB无关则,空格位置改变
        }
        vis[x1][y1][x2][y2][x][y]=0;
    }
    int main()
    {
        input();
        dfs(a.x,a.y,b.x,b.y,k.x,k.y,0);
        printf("%d\n",minn);
        return 0;
    }

转自https://blog.csdn.net/riba2534/article/details/65938125

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值