HDU1195Open the Lock( BFS )

题意:开锁,给出了密码的初始状态,和目标状态,这里密码是固定的四位,每次可以把某一位加一或者减一,再者交换相邻的两位,最左边与最右边是不相邻的

解法:BFS,实现操作的函数即可

#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#include<set>
#include<stack>
#define cl(a,b) memset(a,b,sizeof(a));
#define LL long long
#define P pair<int,int>
#define X first
#define Y second
#define pb push_back
#define out(x) cout<<x<<endl;
using namespace std;
const int maxn=9999+10;
const int inf=9999999;

int init,target;
int change(int num,int pos,int kind){
    int tmp[4];
    int i=0;
    while(num){
        tmp[i++]=num%10;
        num/=10;
    }
    reverse(tmp,tmp+4);
    if(kind==1){///add
        tmp[pos]++;
        if(tmp[pos]==10){
            tmp[pos]=1;
        }
    }
    else {
        tmp[pos]--;
        if(tmp[pos]==0){
            tmp[pos]=9;
        }
    }
    return tmp[0]*1000+tmp[1]*100+tmp[2]*10+tmp[3];
}
int swapnum(int num,int a,int b){
    int tmp[4];
    int i=0;
    while(num){
        tmp[i++]=num%10;
        num/=10;
    }
    reverse(tmp,tmp+4);
    swap(tmp[a],tmp[b]);
    return tmp[0]*1000+tmp[1]*100+tmp[2]*10+tmp[3];
}
bool vis[maxn];
int step[maxn];
int bfs(){
    cl(vis,false);
    cl(step,0);
    queue<int> q;
    q.push(init);
    vis[init]=true;

    while(!q.empty()){
        int tmp=q.front();q.pop();
        if(tmp==target){
            return step[tmp];
        }

        for(int i=0;i<=3;i++){///add
            int x=change(tmp,i,1);
            if(!vis[x]){
                vis[x]=true;
                step[x]=step[tmp]+1;
                q.push(x);
            }
        }
        for(int i=0;i<=3;i++){
            int x=change(tmp,i,0);
            if(!vis[x]){
                vis[x]=true;
                step[x]=step[tmp]+1;
                q.push(x);
            }
        }
        for(int i=0;i<3;i++){
            int x=swapnum(tmp,i,i+1);
            if(!vis[x]){
                vis[x]=true;
                step[x]=step[tmp]+1;
                q.push(x);
            }
        }

    }
    return -1;
}

int main(){

    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&init,&target);
        printf("%d\n",bfs());
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 00:48:55

HDU1195Open the Lock( BFS )的相关文章

hdu - 1195 Open the Lock (bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1195 这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个状态都能遍历到. 得到四个数之后,分三种情况处理,每次改变一个数之后都要加入队列,最先输出的就是步数最少. 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 using namespace std;

hdu1195Open the Lock

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195 搜索就三种规则, 一个是+1 一个是-1 还有一个是交换,用bfs搜索就行了,参照大神的思路... 代码: #include <cstdio> #include <queue> #include <cstring> using namespace std; int a[5]; int b[5]; struct Node { int di[5]; int st; };

HDU 1195 Open the Lock 双向BFS

题目链接:Open the Lock 题意:就是给定两个4位数,起始,结束.问从起始数字到达结束数字 最少变换多少步,每个数 可以+1 / -1 或交换位置,都算做是一步. 单广,双广都用了,感觉双向BFS,太棒了,HDU的这个题双向BFS时间优化的太棒了 有图,有真相! 时间优化了近9倍... PS:今天还学习一个sscanf函数,挺棒的 单搜的代码就不贴了,贴个双搜的 #include<cstdio> #include <iostream> #include<cstrin

HDU 1195 Open the Lock (不一样的BFS)

Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6045    Accepted Submission(s): 2697 Problem Description Now an emergent task for you is to open a password lock. The password is c

hdu 1195 Open the Lock (bfs+优先队列)

Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4253    Accepted Submission(s): 1858 Problem Description Now an emergent task for you is to open a password lock. The password is c

hdu 1195:Open the Lock(暴力BFS广搜)

mediaxyz是一位研究ffmpeg有三年的高人了,这几天一直在折腾ffmpeg中的x264,就是不知道该如何控制码率,主要是参数太多,也不知道该如何设置,在 google上search了一下,这方面的介绍为0,那就找mediaxyz请教请教吧,这些可都是经验,非常宝贵! 以下是与mediaxyz在QQ上聊天的记录,只有一部分,因为QQ把之前的谈话删除了,但基本上精髓都可这里了. mediaxyz 23:40:26你说的qsable是c->global_quality吧 Leon 23:40:

HDU 1195.Open the Lock

Open the Lock Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u SubmitStatusPracticeHDU 1195 Description Now an emergent task for you is to open a password lock. The password is consisted of four digits. Each digit is numbe

BFS专题

题目编号 OJ编号 题目名称 题解链接 Problem A HDU 1548 A strange lift http://www.cnblogs.com/ohyee/p/5389459.html Problem B HDU 1372 Knight Moves http://www.cnblogs.com/ohyee/p/5389471.html Problem C HDU 2717 Catch That Cow http://www.cnblogs.com/ohyee/p/5389479.htm

HDU 1195 Open the Lock (双向广搜)

题意:给你初始4个数字和目标4个数字,问是否能由初始经过变换到目标数字: 变换规则:每个数字可以加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的). 双向广搜:分别对初始和目标数字进行广搜,vis数组用1和2标记两种已搜索的数字,用mp数组记录状态的步数. 当从前往后搜可以到达2或从后往前搜可以到达1状态则就可以了... #include<stdio.h> #include<string.h> #include<string> #inclu