HDU--1195--bfs--Open the Lock

/*
    Name: HDU--1195--Open the Lock
    Author: shen_渊 
    Date: 17/04/17 08:54
    Description: bfs,用四维数组标记状态,每位数字可以做三种操作 +1,-1,交换 
                可以不用优先队列,题意决定,优先队列更费时间 
*/

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct node{
    int steps;
    string s;
    node():steps(0){
    };
    bool operator <(const node &a)const{
        return steps>a.steps;
    }
};
int bfs();
int vis[10][10][10][10];
string str1,str2;
int main()
{
    ios::sync_with_stdio(false);
//    freopen("in.txt","r",stdin);
    int n;cin>>n;
    while(n--){
        memset(vis,0,sizeof(vis));
        cin>>str1>>str2;
        if(str1 == str2)cout<<"0
";
        else cout<<bfs()<<endl;
    }
    return 0;
}
int bfs(){
    priority_queue<node> q;
    node p;
    p.s = str1;
    q.push(p);
    vis[p.s[0]-'0'][p.s[1]-'0'][p.s[2]-'0'][p.s[3]-'0'] = 1;
    while(!q.empty()){
        node a,temp;
        temp = q.top();q.pop();
        if(temp.s == str2)return temp.steps;
        for(int i=0; i<4; ++i) {
            //+1
            a.s = temp.s;
            if(a.s[i] == '9')a.s[i] = '1';
            else a.s[i] += 1;
            if(!vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0']){
                a.steps = temp.steps + 1;
                q.push(a);
                vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0'] = 1;
            }
            //-1
            a.s = temp.s;
            if(a.s[i] == '1')a.s[i] = '9';
            else a.s[i] -= 1;
            if(!vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0']){
                a.steps = temp.steps + 1;
                q.push(a);
                vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0'] = 1;
            }
            //交换 
            if(i<3){
                a.s = temp.s;
                a.s[i] = temp.s[i+1];
                a.s[i+1] = temp.s[i];
                if(!vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0']){
                a.steps = temp.steps + 1;
                q.push(a);
                vis[a.s[0]-'0'][a.s[1]-'0'][a.s[2]-'0'][a.s[3]-'0'] = 1;
                }
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/slothrbk/p/7251878.html