• 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;
    }
  • 相关阅读:
    u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植
    Linux 驱动框架---驱动中的中断
    Linux 驱动框架---驱动中的并发
    Linux 驱动框架---platform驱动框架
    Linux内核实现透视---软中断&Tasklet
    Linux内核实现透视---硬中断
    u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解
    redis缓存的安装和使用
    ArrayList、LinkedList、Vector的区别
    Java中的IO流系统详解
  • 原文地址:https://www.cnblogs.com/langyao/p/7251878.html
Copyright © 2020-2023  润新知