1. 程式人生 > >[HDU1195]Open the Lock

[HDU1195]Open the Lock

con 另一個 name urn c字符串 clas har const png

題目大意:給你一個4位數的初始狀態(只包含1~9),要求你變化成另一個4位數。

變化規則為:每次可給任意一位加1或減1(1減1變為9,9加1變為1),或交換相鄰兩個數位上的數字(第一位和最後一位不相鄰)。

要你求出最少的變化次數。

解題思路:這道題很明顯是一道BFS的題,只不過變化的操作復雜了點。我使用了字符串進行處理。

一開始我用的是STL的string,後來我改成了C字符串,對比如下:

技術分享

這充分說明了string的慢。。

操作雖然復雜,但耐心點還是能寫好的。

具體見代碼。

C++ Code:

#include<cstdio>
#include<string.h>
#include<stdlib.h>
using namespace std;
char n[5],m[5];
struct sss{
    int a;
    char s[5];
};
sss d[9002];
bool b[10001];
const int dd[]={1,-1};
void bfs(){
    int l=0,r=1;
    memset(b,0,sizeof(b));
    d[1].a=0;
    strcpy(d[1].s,n);
    while(l!=r){
        l=l%9000+1;
        for(int i=0;i<4;i++)
        for(int j=0;j<3;j++)
        if(j!=2){
            char c[5];
            strcpy(c,d[l].s);
            c[i]+=dd[j];
            if(c[i]==‘0‘)c[i]=‘9‘;
            if(c[i]>‘9‘)c[i]=‘1‘;
            int f=atoi(c);
            if(!b[f]){
                b[f]=1;
                r=r%9000+1;
                strcpy(d[r].s,c);
                d[r].a=d[l].a+1;
                if(strcmp(c,m)==0){
                	printf("%d\n",d[r].a);
                    return;
                }
            }
        }else{
            for(int k=0;k<=2;k++){
                char c[5];
                strcpy(c,d[l].s);
                char f=c[k];
                c[k]=c[k+1];
                c[k+1]=f;
                int ll=atoi(c);
            if(!b[ll]){
                b[ll]=1;
                r=r%9000+1;
                strcpy(d[r].s,c);
                d[r].a=d[l].a+1;
                if(strcmp(c,m)==0){
                	printf("%d\n",d[r].a);
                    return;
                }
            }
            }
        }
    }
}
int main(){
    int o;
    scanf("%d",&o);
    while(o--){
    	scanf("%s",n);
    	scanf("%s",m);
        if(strcmp(n,m)==0){
            puts("0");
            continue;
        }
        bfs();
    }
}

  

[HDU1195]Open the Lock