uva-10001

题解:给你三个数,第一个是一个小于256的数,将这个数转化为2进制会有八个值,分别代表表中的八中情况。第二个数则是新字符串的长度,第三个是新字符串,题目问新字符串有没有可能按第一个数给的方式由别的字符串转化过来。

例如第一个数是8 ,自动机编号是 8 ,将8转化为2进制是00001000,每行的都对应8的一个2进制码
其意思为:

旧字符串     转化后的新字符串
0 0 0       -->      0
0 0 1       -->      0
0 1 0       -->      0
0 1 1       -->      0

1 0 0       -->      1

1 0 1      -->      0

1 1 0      -->      0

1 1 1      -->      0

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <math.h>
#include <stdlib.h>
#include <time.h>

#define ll long long

using namespace std;

const int N = 40;

int dir[8][3] = {{0,0,0},{0,0,1},{0,1,0},{0,1,1},
				{1,0,0},{1,0,1},{1,1,0},{1,1,1}};
int vis[N],state[N],newStr[N];
bool ok;
int n;

void bfs(int cur){
	if(cur==n){
		if(vis[0]==vis[n]&&vis[1]==vis[n+1]){
			ok = true;
		}
		return;
	}
	for(int i = 0 ; i < 8 ; i++){
		if(state[i]==newStr[cur]){
			if(!cur){
				vis[0] = dir[i][0];
				vis[1] = dir[i][1];
				vis[2] = dir[i][2];
				bfs(cur+1);
			}else{
				if(vis[cur]==dir[i][0]&&vis[cur+1]==dir[i][1]){
					vis[cur+2] = dir[i][2];
					bfs(cur+1);
				}
			}
		}
	}
	return;
}

int main(){
	int a;
	char s[N];
	while(~scanf("%d %d %s",&a,&n,s)){
		memset(vis,0,sizeof vis);
		memset(state,0,sizeof state);
		memset(newStr,0,sizeof newStr);
		ok = false;
		for(int i = 0 ; i < 8 ; i++){
			state[i] = a%2;
			a/=2;
		}
		for(int i = 0 ; i < n ; i++){
			newStr[i] = s[i] - '0';
		}
		bfs(0);
		if(ok){
			cout<<"REACHABLE"<<endl;
		}else{
			cout<<"GARDEN OF EDEN"<<endl;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值