题解:给你三个数,第一个是一个小于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;
}
}
}