杭电1195 Open the Lock

13 篇文章 0 订阅

题目大意:有一个紧急开启密码锁的任务。密码由四位数字组成;每个数字从19;每次,可以对每一个数字进行加1或者减1;当从1加到9时,由9再加1会变为1;当从9减到1时,由1再减1会变为9;也可以交换两个相邻的数字,每次操作作为一个step。你的任务就是用最少的步骤解锁!

#include <stdio.h>  
#include <algorithm>  
#include <string.h>  
#include <queue>  
using namespace std;  
  
struct node  
{  
    int num[4],step;  
} first,last;  
  
int vis[11][11][11][11];  
  
void bfs()  
{  
    int i;  
    node a,next;  
    queue<node> q;  
    a = first;  
    a.step = 0;  
    q.push(a);  
    vis[a.num[0]][a.num[1]][a.num[2]][a.num[3]] = 1;  
    while(!q.empty())  
    {  
        a = q.front();  
        q.pop();  
        if(a.num[0] == last.num[0] && a.num[1] == last.num[1] && a.num[2] == last.num[2] && a.num[3] == last.num[3])  
        {  
            printf("%d\n",a.step);  
            return ;  
        }  
        for(i = 0; i<4; i++) //+1  
        {  
            next = a;  
            next.num[i]++;  
            if(next.num[i]==10)  
                next.num[i] = 1;  
            if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])  
            {  
                vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = 1;  
                next.step++;  
                q.push(next);  
            }  
        }  
        for(i = 0; i<4; i++) //-1  
        {  
            next = a;  
            next.num[i]--;  
            if(next.num[i]==0)  
                next.num[i] = 9;  
            if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])  
            {  
                vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = 1;  
                next.step++;  
                q.push(next);  
            }  
        }  
        for(i = 0; i<3; i++) //交换  
        {  
            next = a;  
            next.num[i] = a.num[i+1];  
            next.num[i+1] = a.num[i];  
            if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])  
            {  
                vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = 1;  
                next.step++;  
                q.push(next);  
            }  
        }  
    }  
}  
  
int main()  
{  
    int i,j,t;  
    char s1[10],s2[10];  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%s%s",s1,s2);  
        for(i = 0; i<4; i++)  
        {  
            first.num[i] = s1[i]-'0';  
            last.num[i] = s2[i]-'0';  
        }  
        memset(vis,0,sizeof(vis));  
        bfs();  
    }  
  
    return 0;  
}  


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值