杭電1195 Open the Lock

題目大意:有一個緊急開啓密碼鎖的任務。密碼由四位數字組成;每個數字從19;每次,可以對每一個數字進行加1或者減1;當從1加到9時,由9再加1會變爲1;當從9減到1時,由1再減1會變爲9;也可以交換兩個相鄰的數字,每次操作作爲一個step。你的任務就是用最少的步驟解鎖!

#include <stdio.h>  
#include <algorithm>  
#include <string.h>  
#include <queue>  
using namespace std;  
  
struct node  
{  
    int num[4],step;  
} first,last;  
  
int vis[11][11][11][11];  
  
void bfs()  
{  
    int i;  
    node a,next;  
    queue<node> q;  
    a = first;  
    a.step = 0;  
    q.push(a);  
    vis[a.num[0]][a.num[1]][a.num[2]][a.num[3]] = 1;  
    while(!q.empty())  
    {  
        a = q.front();  
        q.pop();  
        if(a.num[0] == last.num[0] && a.num[1] == last.num[1] && a.num[2] == last.num[2] && a.num[3] == last.num[3])  
        {  
            printf("%d\n",a.step);  
            return ;  
        }  
        for(i = 0; i<4; i++) //+1  
        {  
            next = a;  
            next.num[i]++;  
            if(next.num[i]==10)  
                next.num[i] = 1;  
            if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])  
            {  
                vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = 1;  
                next.step++;  
                q.push(next);  
            }  
        }  
        for(i = 0; i<4; i++) //-1  
        {  
            next = a;  
            next.num[i]--;  
            if(next.num[i]==0)  
                next.num[i] = 9;  
            if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])  
            {  
                vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = 1;  
                next.step++;  
                q.push(next);  
            }  
        }  
        for(i = 0; i<3; i++) //交換  
        {  
            next = a;  
            next.num[i] = a.num[i+1];  
            next.num[i+1] = a.num[i];  
            if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])  
            {  
                vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]] = 1;  
                next.step++;  
                q.push(next);  
            }  
        }  
    }  
}  
  
int main()  
{  
    int i,j,t;  
    char s1[10],s2[10];  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%s%s",s1,s2);  
        for(i = 0; i<4; i++)  
        {  
            first.num[i] = s1[i]-'0';  
            last.num[i] = s2[i]-'0';  
        }  
        memset(vis,0,sizeof(vis));  
        bfs();  
    }  
  
    return 0;  
}  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章