-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPTA:扫雷游戏.cpp
215 lines (189 loc) · 3.6 KB
/
PTA:扫雷游戏.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/*摘自PTA:扫雷游戏*/
/*玩过扫雷游的朋友都知道,该游戏的目标是找出一个nm矩阵内的所有的地雷,
在本题中,你需要为每一个单元格统计出它周围地雷的个数,每个单元格最多有
8个相邻单元格,如下图,44 的格子里,用“*”表示雷,用“^” 表示没有雷。
*^^^
^^^^
^*^^
^^^^
计算后的输出结果为:
*100
2210
1*10
1110
输入格式:
输入包含若干个矩阵,对于每一个矩阵,第一行包含两个数M和N,分别表示该矩
阵的行数和列数(0<N,M<100),接下来N行包含M个字符,就是该矩阵,用
“*”表示地雷,用“^”表示空白。当N=M=0时,表示结束,不用处理该行。
输出格式:
对于每一个矩阵,首先在单独一行打印出矩阵序号:Field #X: 其中X是矩阵的编号,
从1开始编号,接下来N行中,读入的“^”用该位置周围的地雷数目所代替,地雷处
,仍用“*”表示。输出相邻的两个矩阵之间,空一行。
输入样例:
在这里给出一组输入。例如:
4 4
*^^^
^^^^
^*^^
^^^^
8 8
*^^^*^^^
*^****^^
^*^^**^^
^^**^**^
^*^^**^^
*^^^*^^^
^^**^**^
^*^^**^^
0 0
输出样例:
在这里给出相应的输出。例如:
Field #1:
*100
2210
1*10
1110
Field #2:
*324*310
*4****20
2*56**41
23**6**1
2*34**31
*334*531
23**5**1
1*33**31
*/
/*个人基于C++编写,仅供参考*/
#include <iostream>
using namespace std;
int Times = 1;
typedef struct List
{
char **feild;
struct List *next;
}LinkList, *pLinkList;
typedef struct mn
{
int m;
int n;
}mn;
pLinkList CreateNode(char **data);
pLinkList CreateList();
char **GetArray(int n, int m);
void InputArray(char **p, int n, int m);
void PrintArray(char **p, int n, int m);
void DestroyList(pLinkList pHead);
void PrintList(pLinkList pHead, char **pField[], mn Index[]);
void InsertListTail(pLinkList *pRear, char **p);
int main()
{
char **pField[1000];
int i = 0;
char **p = NULL;
mn Index[1000];
//创建头结点
pLinkList HeadNode = CreateList();
//定义头尾指针
pLinkList pHead = HeadNode;
pLinkList pRear = HeadNode;
//输入雷阵
while (1)
{
cin >> Index[i].m >> Index[i].n;
if (Index[i].m == 0 && Index[i].n == 0) break;
p = GetArray(Index[i].n, Index[i].m);
pField[i] = p;
InputArray(p, Index[i].n, Index[i].m);
InsertListTail(&pRear, p);
i++;
}
//打印雷阵
PrintList(pHead,pField, Index);
DestroyList(pHead);
return 0;
}
void InsertListTail(pLinkList *pRear, char **p)
{
pLinkList NewNode = CreateNode(p);
(*pRear)->next = NewNode;
*pRear = NewNode;
}
pLinkList CreateList()
{
pLinkList NewList = new LinkList;
NewList->next = NULL;
return NewList;
}
pLinkList CreateNode(char **data)
{
pLinkList NewNode = new LinkList;
NewNode->feild = data;
NewNode->next = NULL;
return NewNode;
}
char **GetArray(int n, int m)
{
int i;
char **p;
p = new char*[n+2];
for (i = 0; i < n+2; i++)
p[i] = new char[m+2];
return p;
}
void InputArray(char **p, int n, int m)
{
int i, j;
for (i = 1; i < n+1; i++)
for (j = 1; j < m+1; j++)
cin >> p[i][j];
}
void PrintArray(char **p, int n, int m)
{
int i, j;
int num = 0;
cout << "Field #" << Times<< ":" <<endl;
Times++;
for (i = 1; i < n+1; i++)
{
for (j = 1; j < m+1; j++)
{
if (p[i][j] == '*') cout << "*";
else
{
if (p[i + 1][j] == '*') num += 1;
if (p[i - 1][j] == '*') num += 1;
if (p[i][j - 1] == '*') num += 1;
if (p[i][j + 1] == '*') num += 1;
if (p[i - 1][j - 1] == '*') num += 1;
if (p[i - 1][j + 1] == '*') num += 1;
if (p[i + 1][j - 1] == '*') num += 1;
if (p[i + 1][j + 1] == '*') num += 1;
cout << num;
num = 0;
}
}
cout<<endl;
}
}
void PrintList(pLinkList pHead, char **pField[], mn Index[])
{
pHead = pHead->next;
int i = 0;
while (pHead)
{
PrintArray(pField[i], Index[i].n, Index[i].m);
cout << endl;
pHead = pHead->next;
i++;
}
}
void DestroyList(pLinkList pHead)
{
pLinkList p;
while (pHead)
{
p = pHead;
pHead = pHead->next;
delete p;
}
}