瑪雅人的密碼(利用bfs)
阿新 • • 發佈:2018-12-14
題目描述
瑪雅人有一種密碼,如果字串中出現連續的2012四個數字就能解開密碼。給一個長度為N的字串,(2=<N<=13)該字串中只含有0,1,2三種數字,問這個字串要移位幾次才能解開密碼,每次只能移動相鄰的兩個數字。例如02120經過一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此輸出為1.如果無論移位多少次都解不開密碼,輸出-1。輸入描述:
輸入包含多組測試資料,每組測試資料由兩行組成。 第一行為一個整數N,代表字串的長度(2<=N<=13)。 第二行為一個僅由0、1、2組成的,長度為N的字串。
輸出描述:
對於每組測試資料,若可以解出密碼,輸出最少的移位次數;否則輸出-1。
輸入
複製5 02120
輸出
複製1
解析:利用bfs的思想進行
程式碼如下:
方法一:bfs(純C,無利用queue函式)
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> char pass[]="2012"; typedef struct queue{ char str[15]; int deep; struct queue *next; }*LQueue; int check(char *s,int n){ int i=0,j=0; while(i<n&&j<4){ if(s[i]==pass[j]){ i++; j++; }else{ i=i-j+1; j=0; } } if(j==4) return 1; return 0; } int func(char *s,int n){ int n0=0,n1=0,n2=0,i=0; for(i=0;i<n;i++){ if(s[i]=='0') n0++; else if(s[i]=='1') n1++; else if(s[i]=='2') n2++; } if(n0>0&&n1>0&&n2>1) return 1; return 0; } int main(){ int n=0,i=0,result=0; char str[15],t=0; while(~scanf("%d",&n)){ scanf("%s",str); LQueue head=(queue *)malloc(sizeof(queue)); LQueue rear=head; strncpy(head->str,str,n); head->deep=0; if(func(str,n)==0) result=-1; else{ while(check(str,n)==0){ for(i=0;i<n-1;i++){ LQueue p=(queue *)malloc(sizeof(queue)); strncpy(p->str,str,n); t=p->str[i]; p->str[i]=p->str[i+1]; p->str[i+1]=t; p->deep=head->deep+1; rear->next=p; rear=p; } head=head->next; strncpy(str,head->str,n); } result=head->deep; } printf("%d\n",result); } return 0; }
方法二:bfs利用C++函式庫的queue實現
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<queue> using namespace std; struct node{ char str[15]; int deep; }; queue<node> Q; int bfs(int n){ int i,j; node tmp,p=Q.front(); char x; for(i=0;i<n;i++){ if(p.str[i]=='2'&&p.str[i+1]=='0'&&p.str[i+2]=='1'&&p.str[i+3]=='2') return p.deep; } while(Q.empty()==false){ p=Q.front(); Q.pop(); for(i=0;i<n;i++){ strcpy(tmp.str,p.str); x=tmp.str[i]; tmp.str[i]=tmp.str[i+1]; tmp.str[i+1]=x; tmp.deep=p.deep+1; Q.push(tmp); for(j=0;j<n;j++) if(tmp.str[j]=='2'&&tmp.str[j+1]=='0'&&tmp.str[j+2]=='1'&&tmp.str[j+3]=='2') return tmp.deep; } } return -1; } int ok(char *a,int n){ int i,n0=0,n1=0,n2=0; for(i=0;i<n;i++){ if(a[i]=='0') n0++; else if(a[i]=='1') n1++; else if(a[i]=='2') n2++; } if(n0>0&&n1>0&&n2>1) return 1; return 0; } int main(){ int n; char a[15]; while(~scanf("%d",&n)){ scanf("%s",a); if(ok(a,n)==0){ printf("-1\n"); continue; } while(Q.empty()==false) Q.pop(); node p; strcpy(p.str,a); p.deep=0; Q.push(p); int res=bfs(n); printf("%d\n",res); } return 0; }