生命游戲其實是一個零玩家游戲,它包括一個二維矩形世界,這個世界中的每個方格居住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決於相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匮乏而在下一個時刻死去;相反,如果周圍活細胞過少,這個細胞會因太孤單而死去。實際中,你可以設定周圍活細胞的數目怎樣時才適宜該細胞的生存。如果這個數目設定過高,世界中的大部分細胞會因為找不到太多的活的鄰居而死去,直到整個世界都沒有生命;如果這個數目設定過低,世界中又會被生命充滿而沒有什麼變化。實際中,這個數目一般選取2或者3;這樣整個生命世界才不至於太過荒涼或擁擠,而是一種動態的平衡。這樣的話,游戲的規則就是:當一個方格周圍有2或3個活細胞時,方格中的活細胞在下一個時刻繼續存活;即使這個時刻方格中沒有活細胞,在下一個時刻也會“誕生”活細胞。在這個游戲中,還可以設定一些更加復雜的規則,例如當前方格的狀況不僅由父一代決定,而且還考慮祖父一代的情況。你還可以作為這個世界的上帝,隨意設定某個方格細胞的死活,以觀察對世界的影響。
以上內容來自百度。某公司線上筆試出了這麼一個編程題。模仿了有限的二維空間(x*y)的情況,輸入當前時刻,得到下一時刻的狀態。
代碼很簡單 ,運行通過了測試,當然我也不知道是否完全正確。只是記錄一下,歸於ACM吧 。望批評指正。
下面是我的代碼():
1 #include <iostream>
2
3
4 using namespace std;
5
6 void Test(int x,int y);
7 char** imalloc(int x,int y);
8 void ifree(int x,char** Temp);
9 char **now = NULL;
10 char **next = NULL;
11
12 int main()
13 {
14 int x = 0;
15 int y = 0;
16 int i = 0;
17
18
19 while(cin>>x>>y)
20 {
21 //申請內存
22 now = imalloc(x+2,y+3); //申請(x+1)*(y+1) 外加每行後面的“\0”
23 next= imalloc(x,y+1);
24
25 //輸入
26 for (i = 0;i<x;i++)
27 {
28 cin>>*(now+i+1)+1;
29
30 }
31 Test(x,y);
32
33 //輸出
34 cout<<x<<" "<<y<<endl;
35 for (i = 0;i<x;i++)
36 {
37 cout<<*(next+i)<<endl;
38 }
39
40 //釋放內存
41 ifree(x+2,now);
42 ifree(x,next);
43
44 }
45
46 return 0;
47 }
48 char** imalloc(int x,int y)
49 {
50 int i = 0;
51
52 char** Temp = new char*[x];
53 for (i=0;i<x;i++)
54 {
55 *(Temp+i) = new char[y];
56 memset(*(Temp+i),0,y);
57
58 }
59 return Temp;
60
61
62 }
63 void ifree(int x,char** Temp)
64 {
65 int i =0;
66 for (i=0;i<x;i++)
67 {
68 delete *(Temp+i);
69 }
70 delete Temp;
71
72 }
73 void Test(int x,int y)
74 {
75
76 int i = 0;
77 int j = 0;
78 for (i=0;i<x;i++)
79 {
80
81 for (j=0;j<y;j++)
82 {
83 int iCount = 0;
84 //判斷鄰居的情況呀
85 //左上
86 if (now[i][j]=='*')
87 {
88 iCount++;
89 }
90 //上
91 if (now[i][j+1]=='*')
92 {
93 iCount++;
94 }
95 //右上
96 if (now[i][j+2]=='*')
97 {
98 iCount++;
99 }
100 //左
101 if (now[i+1][j]=='*')
102 {
103 iCount++;
104 }
105 //右
106 if (now[i+1][j+2]=='*')
107 {
108 iCount++;
109 }
110 //左下
111 if (now[i+2][j]=='*')
112 {
113 iCount++;
114 }
115 //下
116 if (now[i+2][j+1]=='*')
117 {
118 iCount++;
119 }
120 //右上
121 if (now[i+2][j+2]=='*')
122 {
123 iCount++;
124 }
125
126 //判斷當前位置的下一刻
127 if (now[i+1][j+1]=='*') //當前活著
128 {
129 if (iCount<2||iCount>3)
130 {
131 next[i][j] = '.';
132 }
133 else if (iCount==2||iCount==3)
134 {
135 next[i][j] = '*';
136 }
137
138 }
139 else if (now[i+1][j+1]=='.')//當前死亡
140 {
141
142 if (iCount==3)
143 {
144 next[i][j] = '*';
145 }
146 else
147 {
148 next[i][j] = '.';
149 }
150 }
151
152 }
153 }
154 }