pascal 生命游戏(我的代码只能过一个点?)急急急!!!!!!高悬赏(好的再加)
描述Description描述生命游戏(Gameoflife)由英国数学家JohnConway在1970年发明。事实上,它是一个“零人游戏”,也没有胜负之分,而是相当于一...
描述 Description
描述
生命游戏(Game of life)由英国数学家John Conway在1970年发明。事实上,它是一个“零人游戏”,也没有胜负之分,而是相当于一个确定性自动机。
游戏在N×M的细胞组成的矩阵里进行,每个细胞每个时刻的状态可能是“存活”或者“休眠”两种,细胞矩阵的状态会按以下规则进行演化:
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目不足两个,则下一秒将由于孤独而进入休眠状态。
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目超过三个,则下一秒将由于过度拥挤而进入休眠状态。
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目为两或三个,则下一秒将继续保持存活状态。
一个休眠状态的细胞,在某一秒,若周围的存活状态的细胞数目为正好三个,则认为是比较适合生存的状态,将于下一秒进入存活状态。
这里“周围”的范围包括一个细胞的上、下、左、右、左上、左下、右上、右下的细胞,如果存在的话。
现在,给定一个初始状态(即第1秒时的状态),请按照规则计算第T秒时的状态。
输入格式 Input Format
第一行,三个空格隔开的整数:M、N和T。
第二行开始的N行,每行M个字符,“0”或“1”分别代表休眠状态与存活状态的细胞。
输出格式 Output Format
输出N行,每行M个“0”或“1”,表示第T秒时的状态。
5 5 1
00000
01100
01010
00100
00000
输出
00000
01100
01010
00100
00000
我的代码
const
a:array[1..8,1..2] of integer=((1,1),(-1,-1),(-1,1),
(0,-1),(0,1),(-1,0),
(1,-1),(1,0));
var
i,j,k,n,m,l,t:integer;
c:string;
b,b1:array[0..1000,0..1000] of boolean;
procedure hp;
var
i,j,w,p:integer;
begin
b1:=b;
for i:=1 to m do
for j:=1 to n do
begin
p:=0;
for w:=1 to 8 do
if (i+a[w,1]<=m) and(i+a[w,1]>0)
and(j+a[w,2]<=n) and(j+a[w,2]>0) then
if b[i+a[w,1],j+a[w,2]] then
inc(p);
if p<2 then b1[i,j]:=false;
if p=3 then b1[i,j]:=true;
if p>3 then b1[i,j]:=false;
end;
b:=b1;
end;
begin
readln(n,m,t);
for i:=1 to m do
begin
readln(c);
for j:=1 to n do
if c[j]='1' then b[i,j]:=true;
end;
for i:=1 to t do
hp;
for i:=1 to m do
begin
for j:=1 to n do
if b[i,j] then write(1) else write(0);
writeln;
end;
end.
大家最好将我的程序调试一下(我选了几个比较弱的数据都能过);
有些麻烦,谢谢大家 展开
描述
生命游戏(Game of life)由英国数学家John Conway在1970年发明。事实上,它是一个“零人游戏”,也没有胜负之分,而是相当于一个确定性自动机。
游戏在N×M的细胞组成的矩阵里进行,每个细胞每个时刻的状态可能是“存活”或者“休眠”两种,细胞矩阵的状态会按以下规则进行演化:
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目不足两个,则下一秒将由于孤独而进入休眠状态。
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目超过三个,则下一秒将由于过度拥挤而进入休眠状态。
一个存活状态的细胞,在某一秒,若周围的存活状态的细胞数目为两或三个,则下一秒将继续保持存活状态。
一个休眠状态的细胞,在某一秒,若周围的存活状态的细胞数目为正好三个,则认为是比较适合生存的状态,将于下一秒进入存活状态。
这里“周围”的范围包括一个细胞的上、下、左、右、左上、左下、右上、右下的细胞,如果存在的话。
现在,给定一个初始状态(即第1秒时的状态),请按照规则计算第T秒时的状态。
输入格式 Input Format
第一行,三个空格隔开的整数:M、N和T。
第二行开始的N行,每行M个字符,“0”或“1”分别代表休眠状态与存活状态的细胞。
输出格式 Output Format
输出N行,每行M个“0”或“1”,表示第T秒时的状态。
5 5 1
00000
01100
01010
00100
00000
输出
00000
01100
01010
00100
00000
我的代码
const
a:array[1..8,1..2] of integer=((1,1),(-1,-1),(-1,1),
(0,-1),(0,1),(-1,0),
(1,-1),(1,0));
var
i,j,k,n,m,l,t:integer;
c:string;
b,b1:array[0..1000,0..1000] of boolean;
procedure hp;
var
i,j,w,p:integer;
begin
b1:=b;
for i:=1 to m do
for j:=1 to n do
begin
p:=0;
for w:=1 to 8 do
if (i+a[w,1]<=m) and(i+a[w,1]>0)
and(j+a[w,2]<=n) and(j+a[w,2]>0) then
if b[i+a[w,1],j+a[w,2]] then
inc(p);
if p<2 then b1[i,j]:=false;
if p=3 then b1[i,j]:=true;
if p>3 then b1[i,j]:=false;
end;
b:=b1;
end;
begin
readln(n,m,t);
for i:=1 to m do
begin
readln(c);
for j:=1 to n do
if c[j]='1' then b[i,j]:=true;
end;
for i:=1 to t do
hp;
for i:=1 to m do
begin
for j:=1 to n do
if b[i,j] then write(1) else write(0);
writeln;
end;
end.
大家最好将我的程序调试一下(我选了几个比较弱的数据都能过);
有些麻烦,谢谢大家 展开
展开全部
算法很朴素,没细看,估计差不多。可能有两个原因。一个是你的布朗数组没有初始化为false。第二个可能是数据太强了,你的数组不够。请你试试再联系我。我没有仔细检查程序。
追问
没用的,布尔数组默认值为false,我用true来表示活着的细胞,休眠的false,故不进行该变
for i:=1 to m do
begin
readln(c);
for j:=1 to n do
if c[j]='1' then b[i,j]:=true;
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
hp过程中,应判断完所有元素再改变原元素,一边查找一边改变肯定出错
追问
我不是用b1记录一下,查找完毕后再改变?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没什么好说的,直接模拟吧
注意别被‘不足’ ‘超过’给阴了
另外休眠和复活是同时进行的
t的大小可以忽略不计,正常模拟绝对不超时
但是由于要同时进行,所以可以弄一个临时数组保存下来,在原来的数组里面判断,然后再临时数组里面改,最后再把赋值一下就可以啦
看似纯模拟会超时,但其实完全不会,一定要注意n,m的次序,我就是因为这个而悲剧了
注意别被‘不足’ ‘超过’给阴了
另外休眠和复活是同时进行的
t的大小可以忽略不计,正常模拟绝对不超时
但是由于要同时进行,所以可以弄一个临时数组保存下来,在原来的数组里面判断,然后再临时数组里面改,最后再把赋值一下就可以啦
看似纯模拟会超时,但其实完全不会,一定要注意n,m的次序,我就是因为这个而悲剧了
追问
我好像是纯模拟啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询