Codeforces Gym 100650C The Game of Efil DFS

来源:互联网 发布:python color map 编辑:程序博客网 时间:2024/05/19 14:38

题目链接:

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

题意:

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

题解:

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

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 1e5+10;int n,m,k,ans;int G[20][20],d[20][20],d2[20][20],cnt[20][20];int dx[8] = {0,0,1,-1,1,1,-1,-1};int dy[8] = {1,-1,0,0,1,-1,1,-1};int C(int x,int k){    if(x == -1) return k-1;    if(x == k) return 0;    return x;}bool check(){    MS(d2); MS(cnt);    for(int i=0; i<n; i++)        for(int j=0; j<m; j++){            for(int k=0; k<8; k++){                int x = C(i+dx[k],n);                int y = C(j+dy[k],m);                if(d[x][y] == 1)                    cnt[i][j]++;            }        }    for(int i=0; i<n; i++)        for(int j=0; j<m; j++){            if(d[i][j] == 1){                if(cnt[i][j]==2 || cnt[i][j]==3)                    d2[i][j] = 1;                else                    d2[i][j] = 0;            }else{                if(cnt[i][j] == 3)                    d2[i][j] = 1;                else                    d2[i][j] = 0;            }        }    for(int i=0; i<n; i++)        for(int j=0; j<m; j++)            if(G[i][j] != d2[i][j])                return 0;    return 1;}void dfs(int x,int y){    if(x == n){        if(check()) ans++;        return ;    }    d[x][y] = 0;    if(y == m-1)        dfs(x+1,0);    else        dfs(x,y+1);    d[x][y] = 1;    if(y == m-1)        dfs(x+1,0);    else        dfs(x,y+1);    d[x][y] = 0;}int main(){    int cas=1;    while(cin>>n>>m,(n+m)){        MS(d); MS(G); ans=0;        cin >> k;        for(int i=0; i<k; i++){            int x,y; cin>>x>>y;            G[x][y] = 1;        }        dfs(0,0);        if(ans != 0)            cout << "Case " << cas++ << ": " << ans << " possible ancestors.\n";        else            cout << "Case " << cas++ << ": Garden of Eden.\n";    }    return 0;}// http://codeforces.com/gym/100650/attachments
0 0
原创粉丝点击