HDU-1195-Open the Lock(BFS)

题目链接

题意:两个四位数字进行转化,每一次可以对其中一位数+1或者-1(1-1=9 9+1=1),或者交换相邻的两位。

思路,因为最多不超过10000种状态,所以直接bfs一下,有11种状态

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>

#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8

#define pb push_back

#define mem(a) memset(a,0,sizeof a)

using namespace std;

const long long mod = 1000000007;
/**lyc**/
int vis[11][11][11][11];
struct NODE {
    int num[5];
    int step;
};
NODE x1, x2;
NODE exchange(NODE x, int k) {
    if(k <= 4) {
        if(x.num[k] == 9) x.num[k] = 1;
        else x.num[k]++;
    }
    else if(k <= 8) {
        if(x.num[k - 4] == 1) x.num[k - 4] = 9;
        else x.num[k - 4]--;
    }
    else {
        int pos = k - 8;
        swap(x.num[pos], x.num[pos + 1]);
    }
    x.step++;
    return x;
}
void init() {

}
int main() {
    int t;
    char s1[10], s2[10];
    scanf("%d", &t);
    while(t--) {
        memset(vis, INF, sizeof vis);
        scanf("%s%s", s1, s2);
        for(int i = 1; i <= 4; i++) {
            x1.num[i] = s1[i - 1] - '0';
            x2.num[i] = s2[i - 1] - '0';
        }
        x1.step = 0;
        x2.step = INF;
        queue<NODE>gg;
        gg.push(x1);
        vis[x1.num[1]][x1.num[2]][x1.num[3]][x1.num[4]] = 0;
        int kase = 0;
        while(!gg.empty()) {
            NODE temp = gg.front();
            gg.pop();
            for(int i = 1; i <= 11; i++) {
                NODE temp1 = exchange(temp, i);
                if(vis[temp1.num[1]][temp1.num[2]][temp1.num[3]][temp1.num[4]] == INF) {
                    vis[temp1.num[1]][temp1.num[2]][temp1.num[3]][temp1.num[4]] = temp1.step;
                    gg.push(temp1);
                }
            }
        }
        printf("%d\n", vis[x2.num[1]][x2.num[2]][x2.num[3]][x2.num[4]]);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值