Uva--10001(回溯)
2014-07-16 23:55:21
Left | Cell | Right | New | |||||
[i-1] | [i] | [i + 1] | State | |||||
0 | 0 | 0 | 0 | 0 * 20 | ||||
0 | 0 | 1 | 1 | 1 * 21 | ||||
0 | 1 | 0 | 0 | 0 * 22 | ||||
0 | 1 | 1 | 1 | 1 * 23 | ||||
1 | 0 | 0 | 1 | 1 * 24 | ||||
1 | 0 | 1 | 0 | 0 * 25 | ||||
1 | 1 | 0 | 1 | 1 * 26 | ||||
1 | 1 | 1 | 0 | 0 * 27 | ||||
90 | = | Automaton Identifier | ||||||
题意:这题的题意简直坑,我来翻译一下(QAQ)。首先题目给出了一大段背景资料:元胞自动机!乍一看简直就是高端。。。呵呵,其实就是用来练英语阅读的,可以忽略。
进入正文:(1)总共有2^8 == 256种自动机,每个自动机对应一种进化( evolve)法则,看上图,比如现在的state的第i-1、i、i+1个数分别是0,1,0,则根据New State,第i个数由1进化为0。
(2)每个自动机有它的身份标号(identifier),所谓身份标号就是把这个自动机所包含的8个数(0或者1)看成二进制的表达方式(如上图所示)
(3)Input每次给出的是自动机的身份标号和需要判断的state(一列数),如果这个state能通过该自动机达到(也就是某个state’ 能通过该自动机法则进化到state)那么输出REACHABLE,
如果任何state’ 都不能通过自动机达到state,输出GARDEN OF EDEN。
思路:遍历所输入的state的每个数,枚举他进化之前的所有情况,对每个情况再DFS进去处理state的下一个数,直到处理到state的最后一个数,若最后一个数也可行,则REACHABLE!
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 7 int id,n,Judge,d[8][3] = {{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0}, 8 {1,0,1},{1,1,0},{1,1,1}},au[8],s[40],sp[40]; 9 char str[40]; 10 11 void Dfs(int cur){ 12 if(Judge) 13 return; 14 if(cur >= n){ 15 Judge = 1; 16 return; 17 } 18 int pre,in,post; 19 if(cur > 0) pre = cur - 1; 20 else pre = n - 1; 21 in = cur; 22 if(cur < n - 1) post = cur + 1; 23 else post = 0; 24 for(int i = 0; i < 8; ++i){ 25 if(s[cur] == au[i]) 26 if((sp[pre] == -1 || sp[pre] == d[i][0]) 27 && (sp[in] == -1 || sp[in] == d[i][1]) 28 && (sp[post] == -1 || sp[post] == d[i][2])){ 29 int fpre = 0,fin = 0,fpost = 0; 30 if(sp[pre] == -1) fpre = 1; 31 if(sp[in] == -1) fin = 1; 32 if(sp[post] == -1) fpost = 1; 33 sp[pre] = d[i][0]; 34 sp[in] = d[i][1]; 35 sp[post] = d[i][2]; 36 Dfs(cur + 1); 37 if(fpre) sp[pre] = -1; 38 if(fin) sp[in] = -1; 39 if(fpost) sp[post] = -1; 40 } 41 } 42 } 43 44 int main(){ 45 while(scanf("%d %d %s",&id,&n,str) == 3){ 46 for(int i = 7; i >= 0; --i){ 47 au[i] = id & 1; 48 id >>= 1; 49 } 50 for(int i = 0; i < n; ++i) sp[i] = -1; 51 for(int i = 0; i < n; ++i){ 52 s[i] = str[i] - '0'; 53 } 54 Judge = 0; 55 Dfs(0); 56 if(Judge) printf("REACHABLE\n"); 57 else printf("GARDEN OF EDEN\n"); 58 } 59 return 0; 60 }