HDU1195

Problem: Open the Lock
Description: 开一把四位数的密码锁。你可以把任意一个数字加一或减一。如果变成0就是9,如果是10就是1,你也可以交换相邻的两个数字。问需要最少的步数把一把锁解开。
Code(C++):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <queue>

using namespace std;

typedef struct tagNode{
    char digit[5];
    int step;
    tagNode(){}
    tagNode(char _digit[],int _step):
        step(_step){
        strcpy(digit,_digit);
    }
}Node;

char src[5],des[5];
bool used[10000];

int bfs()
{
    queue<Node> que;
    memset(used,false,sizeof(used));
    que.push(Node(src,0));
    used[atoi(src)]=true;
    while(!que.empty()){
        Node now=que.front();
        que.pop();

        char tmp[5];

        for(int i=0;i<4;i++){
            strcpy(tmp,now.digit);
            int d=tmp[i]-'0';
            ++d;
            if(d==10)
                d=1;
            tmp[i]=d+'0';
            if(!strcmp(tmp,des))
                return now.step+1;
            int flag=atoi(tmp);
            if(!used[flag])
                used[flag]=true,
                que.push(Node(tmp,now.step+1));
        }

        for(int i=0;i<4;i++){
            strcpy(tmp,now.digit);
            int d=tmp[i]-'0';
            --d;
            if(!d)
                d=9;
            tmp[i]=d+'0';
            if(!strcmp(tmp,des))
                return now.step+1;
            int flag=atoi(tmp);
            if(!used[flag])
                used[flag]=true,
                que.push(Node(tmp,now.step+1));
        }

        for(int i=0;i<3;i++){
            strcpy(tmp,now.digit);
            char c=tmp[i];
            tmp[i]=tmp[i+1];
            tmp[i+1]=c;
            if(!strcmp(tmp,des))
                return now.step+1;
            int flag=atoi(tmp);
            if(!used[flag])
                used[flag]=true,
                que.push(Node(tmp,now.step+1));
        }
    }
    return -1;
}

int main()
{
    int N;
    for(scanf("%d",&N);N--;){
        scanf("%s%s",src,des);
        int ans=bfs();
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(C语言)