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 }
posted @ 2014-07-17 00:13  Naturain  阅读(151)  评论(0编辑  收藏  举报