• Codeforces Gym 100650C The Game of Efil DFS


    题目链接:

    http://codeforces.com/gym/100650/attachments

    题意:

    每个细胞如果四周细胞太少了,就会孤独而死,如果细胞周围细胞太多了,就会挤死。给你个布局,问你他的上一代布局会有几种。不过这道题的关键在于wrap around这个词,即边界是循环的。

    题解:

    数据范围很小,n*m<=16,所以直接dfs出所有的状态
    然后再check

    代码:

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 typedef long long ll;
      4 #define MS(a) memset(a,0,sizeof(a))
      5 #define MP make_pair
      6 #define PB push_back
      7 const int INF = 0x3f3f3f3f;
      8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
      9 inline ll read(){
     10     ll x=0,f=1;char ch=getchar();
     11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     13     return x*f;
     14 }
     15 //////////////////////////////////////////////////////////////////////////
     16 const int maxn = 1e5+10;
     17 
     18 int n,m,k,ans;
     19 int G[20][20],d[20][20],d2[20][20],cnt[20][20];
     20 int dx[8] = {0,0,1,-1,1,1,-1,-1};
     21 int dy[8] = {1,-1,0,0,1,-1,1,-1};
     22 
     23 int C(int x,int k){
     24     if(x == -1) return k-1;
     25     if(x == k) return 0;
     26     return x;
     27 }
     28 
     29 bool check(){
     30     MS(d2); MS(cnt);
     31     for(int i=0; i<n; i++)
     32         for(int j=0; j<m; j++){
     33             for(int k=0; k<8; k++){
     34                 int x = C(i+dx[k],n);
     35                 int y = C(j+dy[k],m);
     36                 if(d[x][y] == 1)
     37                     cnt[i][j]++;
     38             }
     39         }
     40 
     41     for(int i=0; i<n; i++)
     42         for(int j=0; j<m; j++){
     43             if(d[i][j] == 1){
     44                 if(cnt[i][j]==2 || cnt[i][j]==3)
     45                     d2[i][j] = 1;
     46                 else
     47                     d2[i][j] = 0;
     48             }else{
     49                 if(cnt[i][j] == 3)
     50                     d2[i][j] = 1;
     51                 else
     52                     d2[i][j] = 0;
     53             }
     54         }
     55 
     56     for(int i=0; i<n; i++)
     57         for(int j=0; j<m; j++)
     58             if(G[i][j] != d2[i][j])
     59                 return 0;
     60 
     61     return 1;
     62 }
     63 
     64 void dfs(int x,int y){
     65     if(x == n){
     66         if(check()) ans++;
     67         return ;
     68     }
     69 
     70     d[x][y] = 0;
     71     if(y == m-1)
     72         dfs(x+1,0);
     73     else
     74         dfs(x,y+1);
     75     d[x][y] = 1;
     76     if(y == m-1)
     77         dfs(x+1,0);
     78     else
     79         dfs(x,y+1);
     80     d[x][y] = 0;
     81 }
     82 
     83 int main(){
     84     int cas=1;
     85     while(cin>>n>>m,(n+m)){
     86         MS(d); MS(G); ans=0;
     87 
     88         cin >> k;
     89         for(int i=0; i<k; i++){
     90             int x,y; cin>>x>>y;
     91             G[x][y] = 1;
     92         }
     93         dfs(0,0);
     94         if(ans != 0)
     95             cout << "Case " << cas++ << ": " << ans << " possible ancestors.
    ";
     96         else
     97             cout << "Case " << cas++ << ": Garden of Eden.
    ";
     98     }
     99 
    100     return 0;
    101 }
    102 
    103 // http://codeforces.com/gym/100650/attachments
  • 相关阅读:
    idea 设置注释
    SVN解决冲突
    mysql执行 sql文件遇到USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=utf8错误
    如何查看JDK以及JAVA框架的源码
    一道常被人轻视的前端JS面试题
    Js 常用调试的方法
    主要的Ajax框架都有什么?
    Ajax使用的五步法
    Java正则表达式
    查出在当天所处的日期区间的某些数据
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827675.html
Copyright © 2020-2023  润新知