hdu1195Open the Lock(隐式图的广搜)

题目链接:click here~

题目解析:隐式图的搜索,总共11种状态,依次进行搜即可,注意中间数字输入时要按字符串进行输入。

代码如下:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int begin[6],end[6];
int visit[13][13][13][13];
struct node
{
    int a,b,c,d,step;
};
void bfs(int x1,int x2,int x3,int x4)
{
    memset(visit,0,sizeof(visit));
    node node1,node2;
    queue<node>q;
    node1.a=x1;
    node1.b=x2;
    node1.c=x3;
    node1.d=x4;
    node1.step=0;
    q.push(node1);
    visit[node1.a][node1.b][node1.c][node1.d]=1;
    while(!q.empty())
    {
        node2=q.front();
        q.pop();
        if(node2.a==end[0]&&node2.b==end[1]&&node2.c==end[2]&&node2.d==end[3])
        {
            printf("%d\n",node2.step);
            return;
        }
        else                                   //总共11种状态
        {
            node1.a=node2.a+1;                                        //第一位数字加1
            if(node1.a==10)
            node1.a=1;
            node1.b=node2.b;
            node1.c=node2.c;
            node1.d=node2.d;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a;                              //第二位数字加1
            node1.b=node2.b+1;
            if(node1.b==10)
            node1.b=1;
            node1.c=node2.c;
            node1.d=node2.d;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a;                                 //第三位数字加1
            node1.b=node2.b;
            node1.c=node2.c+1;
            if(node1.c==10)
            node1.c=1;
            node1.d=node2.d;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a;                                //第四位加1
            node1.b=node2.b;
            node1.c=node2.c;
            node1.d=node2.d+1;
            if(node1.d==10)
            node1.d=1;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a-1;                         //第一位减1
            if(node1.a==0)
            node1.a=9;
            node1.b=node2.b;
            node1.c=node2.c;
            node1.d=node2.d;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a;                          //第二位减1
            node1.b=node2.b-1;
            if(node1.b==0)
            node1.b=9;
            node1.c=node2.c;
            node1.d=node2.d;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a;                                 //第三位减1
            node1.b=node2.b;
            node1.c=node2.c-1;
            if(node1.c==0)
            node1.c=9;
            node1.d=node2.d;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a;
            node1.b=node2.b;
            node1.c=node2.c;
            node1.d=node2.d-1;                         //第四位减1
            if(node1.d==0)
            node1.d=9;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.b;                                 //交换1,2位
            node1.b=node2.a;
            node1.c=node2.c;
            node1.d=node2.d;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a;                                //交换2,3位
            node1.b=node2.c;
            node1.c=node2.b;
            node1.d=node2.d;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
            node1.a=node2.a;                                //交换3,4位
            node1.b=node2.b;
            node1.c=node2.d;
            node1.d=node2.c;
            node1.step=node2.step+1;
            if(!visit[node1.a][node1.b][node1.c][node1.d])
            {
                q.push(node1);
                visit[node1.a][node1.b][node1.c][node1.d]=1;
            }
        }
    }
}
int main()
{
    int icase;
    scanf("%d",&icase);
    while(icase--)
    {
       char str1[6],str2[6];
       scanf("%s%s",str1,str2);
       for(int i=0;i<strlen(str1);i++)
       {
           begin[i]=str1[i]-'0';
           end[i]=str2[i]-'0';
       }
       bfs(begin[0],begin[1],begin[2],begin[3]);
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值