1. 程式人生 > >瑪雅人的密碼(利用bfs)

瑪雅人的密碼(利用bfs)

題目描述

瑪雅人有一種密碼,如果字串中出現連續的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。
示例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;
}