95人阅读 评论(0)

# Constraints

Time Limit: 2 secs, Memory Limit: 64 MB

# Description

Almost anyone who has ever taken a class in computer science is familiar with the "Game of Life," John Conway's cellular automata with extremely simple rules of birth, survival, and death that can give rise to astonishing complexity.
The game is played on a rectangular field of cells, each of which has eight neighbors (adjacent cells). A cell is either occupied or not. The rules for deriving a generation from the previous one are:

• If an occupied cell has 0, 1, 4, 5, 6, 7, or 8 occupied neighbors, the organism dies (0, 1: of loneliness; 4 thru 8: of overcrowding).
• If an occupied cell has two or three occupied neighbors, the organism survives to the next gener-ation.
• If an unoccupied cell has three occupied neighbors, it becomes occupied (a birth occurs).

One of the major problems researchers have looked at over the years is the existence of so-called "Garden of Eden" configurations in the Game of Life -- configurations that could not have arisen as the result of the application of the rules to some previous configuration. We're going to extend this question, which we'll call the "Game of Efil": Given a starting configuration, how many possible parent configurations could it have? To make matters easier, we assume a finite grid in which edge and corner cells "wrap around" (i.e., a toroidal surface). For instance, the 2 by 3 configuration:

has exactly three possible parent configurations; they are:

You should note that when counting neighbors of a cell, another cell may be counted as a neighbor more than once, if it touches the given cell on more than one side due to the wrap around. This is the case for the configurations above.

# Input

There will be multiple test cases. Each case will start with a line containing a pair of positive integers m and n, indicating the number of rows and columns of the configuration, respectively. The next line will contain a nonnegative integer k indicating the number of "live" cells in the configuration. The following k lines each contain the row and column number of one live cell, where row and column numbering both start at zero. The final test case is followed by a line where m = n = 0 -- this line should not be processed. You may assume that the product of m and n is no more than 16.

# Output

For each test case you should print one line of output containing the case number and the number of possible ancestors. Imitate the sample output below. Note that if there are 0 ancestors, you should print out
Garden of Eden.

# Sample Input

2 3
2
0 0
0 1
3 3
4
0 0
0 1
0 2
1 1
3 3
5
0 0
1 0
1 2
2 1
2 2
0 0


# Sample Output

Case 1: 3 possible ancestors.
Case 2: 1 possible ancestors.
Case 3: Garden of Eden.


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m;
int map[20][20];
int mm[20][20];
int ans[20][20];
int ansnum;
void dfs(int now){
if (now==n*m){
memset(map,0,sizeof(map));
//memset(tmp,0)
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
map[i][j]=mm[i-1][j-1];
//cout<<map[i][j];
}
//cout<<endl;
}
//上下左右的连接
for(int i=1;i<=m;i++){
map[0][i]=map[n][i];
}
for(int i=1;i<=m;i++){
map[n+1][i]=map[1][i];
}
for (int i=1;i<=n;i++){
map[i][0]=map[i][m];
}
for (int i=1;i<=n;i++){
map[i][m+1]=map[i][1];
}
//四个角
map[0][0]=map[n][m];
map[0][m+1]=map[n][1];
map[n+1][0]=map[1][m];
map[n+1][m+1]=map[1][1];

int tmp[20][20]={0};
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
int sum=map[i-1][j-1]+map[i][j-1]+map[i+1][j-1]
+map[i-1][j]+map[i+1][j]
+map[i-1][j+1]+map[i][j+1]+map[i+1][j+1];
if (map[i][j]==1){
if (sum==3||sum==2){
tmp[i][j]=1;
}
else tmp[i][j]=0;
}
else if(sum==3) tmp[i][j]=1;
}
}
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
if (tmp[i][j]!=ans[i][j]){
return ;
}
}
}
ansnum++;
return;
}
//深搜枚举所有情况
int row=now/m;
int col=now%m;
mm[row][col]=1;
dfs(now+1);
mm[row][col]=0;
dfs(now+1);

}
int main(){
int co=1;
while(cin>>n>>m){
if (n==0) break;
int num;
cin>>num;
ansnum=0;
int x,y;
memset(ans,0,sizeof(ans));
memset(mm,0,sizeof(mm));
for (int i=0;i<num;i++){
cin>>x>>y;
ans[x+1][y+1]=1;
}
dfs(0);
printf("Case %d: ",co++);
if (ansnum==0){
printf("Garden of Eden.\n");
}
else {
printf("%d possible ancestors.\n",ansnum);
}
}

}


0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：29729次
• 积分：1169
• 等级：
• 排名：千里之外
• 原创：90篇
• 转载：10篇
• 译文：0篇
• 评论：2条
评论排行