2016迅雷校园招聘笔试题(1)

 生命游戏
Time Limit: 1000/1000 MS (Java/Others) Memory Limit:65536/65536 K (Java/Others)
Problem Description:生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。这是一个零玩家游戏,它包括一个无限大的二维矩形世界,这个世界是由无数小的方格组成。每个方格中居住着一个活着的或死了的细胞。细胞会受它的邻居(周围的8个方格)中的细胞影响,在每一个时刻之后发生变化,或者死去、或者复活。
冥冥之中,每一个格子中的细胞在每一个时刻的变化,都遵循以下规则:
1. 对任何一个活着的细胞,如果它的邻居中活着的细胞少于2个,那么它在下一个时刻就会因孤独而死去。
2. 对任何一个活着的细胞,如果它的邻居中活着的细胞正好是2个或3个,那么它在下一个时刻就会继续活着。
3. 对任何一个活着的细胞,如果它的邻居中活着的细胞多于3个,那么它在下一个时刻就会因拥挤而死去。
4. 对任何一个死了的细胞,如果它的邻居中活着的细胞刚好是3个,那么它在下一个时刻就会复活。
在每一个时刻,这个无上法则同时发生在所有格子的活着或死了的细胞,没有时间先后之分。而其结果,也仅会在下一个时刻体现。游戏的玩家只能构造一个初始状态,然后观察这个世界的变化。高级玩家精心构造初始状态,能够演绎出一个非常精彩的世界。
你的任务是编写一个程序,模拟有限大小的世界,从标准输入读取初始时刻每个方格中细胞的状态,然后输出在下一个时刻每个方格中细胞的状态。
输入
程序从标准输入读取数据,数据的第1行是空格分隔的两个数字,表示后续数据的行数和每一行的列数。接下来的每一行中,使用点号(.)来表示死了的细胞,星号(*)来表示活着的细胞。关于邻居的说明:每个细胞的8个邻居位于它的上、下、左、右、左上、左下、右上、右下。由于我们只模拟有限大小的世界,所以处于边界的细胞,其邻居数量会相应减少。比如,在下面的世界中,最左上的细胞,它的邻居只有3个,其中1个是活着的;第2行第1列的细胞,它的邻居只有5个,其中1个是活着的;而中间第2行第5列的细胞,邻居则是有8个,其中2个是活着的。

输出
经过程序处理后,输出下一个时刻每个方格中细胞的状态,该数据具有同样的格式。


样例输入


样例输出



Hint

温馨提示
请尽量在全场考试结束10分钟前调试程序,否则由于密集排队提交,可能查询不到编译结果 
点击“调试”亦可保存代码
编程题可以使用本地编译器,此页面不记录跳出次数
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
   int m,n;
      cin>>m>>n;
      vector<string> cell(m);
	  vector<string> acell(m);
      for(int i=0;i<m;i++)
      {
		 cin>>cell[i];
      }
	  vector<string> bcell(m+2);
	  for(int i=0;i<n+2;i++)
	  {
		  bcell[0].push_back('.');
	      bcell[m+1].push_back('.');
	  }
	  for(int i=1;i<m+1;i++)
	  {
		  bcell[i].push_back('.');
		  for(int j=0;j<n;j++)
			  bcell[i].push_back(cell[i-1][j]);
		  bcell[i].push_back('.');
	  }

	  for(int i=1;i<m+1;i++)
	  {
		  for(int j=1;j<n+1;j++)
		  {
		   int count=0;
		   if(bcell[i-1][j-1]=='*') count++;
		   if(bcell[i][j-1]=='*') count++;
		   if(bcell[i+1][j-1]=='*') count++;
		   if(bcell[i-1][j]=='*') count++;
		   if(bcell[i+1][j]=='*') count++;
		   if(bcell[i-1][j+1]=='*') count++;
		   if(bcell[i][j+1]=='*') count++;
		   if(bcell[i+1][j+1]=='*') count++;
		   if(count==3) acell[i-1].push_back('*');
		   else if(count==2&&bcell[i][j]=='*') acell[i-1].push_back('*');
		   else acell[i-1].push_back('.');
		  }
	  }
	  for(int i=0;i<m;i++)
	  {
		  cout<<acell[i]<<endl;
	  }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值