您的位置:首页 > 运维架构

HDU1195---Open the Lock

2015-06-15 23:27 281 查看
用所有情况加队列遍历一下就好

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
bool vis[10][10][10][10];
struct node{  int num[4],count;};
node st,res;
queue<node>q;
void bfs(){
    node ft;
    ft=st;
    ft.count=0;
    vis[ft.num[0]][ft.num[1]][ft.num[2]][ft.num[3]]=1;
    q.push(ft);
    while(!q.empty()){
        ft=q.front();q.pop();
        if(ft.num[0]==res.num[0]&&ft.num[1]==res.num[1]&&ft.num[2]==res.num[2]&&ft.num[3]==res.num[3]){
            printf("%d\n",ft.count);
            return;
        }
        node tp;
        for(int i=0;i<4;i++){
            tp=ft;
            tp.num[i]++;
            if(tp.num[i]==10)
                tp.num[i]=1;
            if (vis[tp.num[0]][tp.num[1]][tp.num[2]][tp.num[3]] != true){
               vis[tp.num[0]][tp.num[1]][tp.num[2]][tp.num[3]]=true;
               tp.count++;
               if(tp.count>40);
               else
               q.push(tp);
            }
    }
        for(int i=0;i<4;i++){
            tp=ft;
            tp.num[i]--;
            if(tp.num[i]==0)
                tp.num[i]=9;
            if(vis[tp.num[0]][tp.num[1]][tp.num[2]][tp.num[3]]!=true){
               vis[tp.num[0]][tp.num[1]][tp.num[2]][tp.num[3]]=true;
               tp.count++;
               if(tp.count>40);
               else
               q.push(tp);
            }
        }
        for (int i=0;i<3;i++)
        {
            tp = ft;
            int temp = tp.num[i]; 
            tp.num[i] = tp.num[i + 1];
            tp.num[i + 1] = temp;
            if (vis[tp.num[0]][tp.num[1]][tp.num[2]][tp.num[3]] != true)
            {
                vis[tp.num[0]][tp.num[1]][tp.num[2]][tp.num[3]] = true;
                tp.count++;
                if(tp.count>40);
               else
               q.push(tp);
            }

        }

    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
    memset(vis,0,sizeof vis);
    int tp;
    scanf("%d",&tp);st.num[0]=tp/1000;st.num[1]=tp%1000/100;st.num[2]=tp%100/10;st.num[3]=tp%10;
    scanf("%d",&tp);res.num[0]=tp/1000;res.num[1]=tp%1000/100;res.num[2]=tp%100/10;res.num[3]=tp%10;
    while(!q.empty()) q.pop();
    bfs();
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: