题目来源:http://bailian.openjudge.cn/dsj2017xly/C/
C:生存游戏
总时间限制: 1000ms 内存限制: 65536kB
描述
有如下生存游戏的规则:
给定一个n*m(1<=n,m<=100)的数组,每个元素代表一个细胞,其初始状态为活着(1)或死去(0)。
每个细胞会与其相邻的8个邻居(除数组边缘的细胞)进行交互,并遵守如下规则:
任何一个活着的细胞如果只有小于2个活着的邻居,那它就会由于人口稀少死去。
任何一个活着的细胞如果有2个或者3个活着的邻居,就可以继续活下去。
任何一个活着的细胞如果有超过3个活着的邻居,那它就会由于人口拥挤而死去。
任何一个死去的细胞如果有恰好3个活着的邻居,那它就会由于繁殖而重新变成活着的状态。
请写一个函数用来计算所给定初始状态的细胞经过一次更新后的状态是什么。
注意:所有细胞的状态必须同时更新,不能使用更新后的状态作为其他细胞的邻居状态来进行计算。
输入
第一行为n和m,而后n行,每行m个元素,用空格隔开。
输出
n行,每行m个元素,用空格隔开。
样例输入
3 4
0 0 1 1
1 1 0 0
1 1 0 1
样例输出
0 1 1 0
1 0 0 1
1 1 1 0
来源
cs10116 final exam
------------------------------------------------------------
思路
模拟题
------------------------------------------------------------
代码
#include<iostream>
#include<fstream>
using namespace std;
bool mat[105][105] = {};
int cal(int x, int y) // 计算(x,y)的邻居个数
{
int cnt = 0;
if (mat[x-1][y])
{
cnt++;
}
if (mat[x+1][y])
{
cnt++;
}
if (mat[x][y+1])
{
cnt++;
}
if (mat[x][y-1])
{
cnt++;
}
if (mat[x-1][y-1])
{
cnt++;
}
if (mat[x-1][y+1])
{
cnt++;
}
if (mat[x+1][y-1])
{
cnt++;
}
if (mat[x+1][y+1])
{
cnt++;
}
return cnt;
}
int main()
{
#ifndef ONLINE_JUDGE
ifstream fin ("C.txt");
int n,m,i,j,neig;
fin >> n >> m;
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
fin >> mat[i][j];
}
}
fin.close();
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
neig = cal(i,j);
if (mat[i][j])
{
if (neig < 2 || neig > 3)
{
cout << "0 ";
}
else
{
cout << "1 ";
}
}
else
{
if (neig == 3)
{
cout << "1 ";
}
else
{
cout << "0 ";
}
}
}
cout << endl;
}
return 0;
#endif
#ifdef ONLINE_JUDGE
int n,m,i,j,neig;
cin >> n >> m;
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
cin >> mat[i][j];
}
}
fin.close();
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
neig = cal(i,j);
if (mat[i][j])
{
if (neig < 2 || neig > 3)
{
cout << "0 ";
}
else
{
cout << "1 ";
}
}
else
{
if (neig == 3)
{
cout << "1 ";
}
else
{
cout << "0 ";
}
}
}
cout << endl;
}
#endif
}