第一種,計算.旁邊有幾顆地雷,
可求.的數字。
第二種,每出現一顆地雷,
地雷四周八個方位各+1。
我用第二種寫法,
感覺第一種比較好實作……
要注意'\0'也算一個字元,
所以column最大值是101。
害我吃了幾次WA -_-。
/* ACM 10189 Minesweeper
* mythnc
* 2011/11/29 15:25:38
* version 2
* run time: 0.016
*/
#include <stdio.h>
#define MAXLEN 100
/* if position (x, y) is not '*' */
#define NOTSTAR(f, x, y) if (f[x][y] != '*') f[x][y]++
void dtoz(char (*)[]);
void findstar(char (*)[]);
void add(char (*)[], int, int);
int row, col;
int main(void)
{
char field[MAXLEN][MAXLEN + 1];
int i, set;
set = 0;
while (scanf("%d %d", &row, &col) == 2) {
if (row == 0 && col== 0)
return 0;
for (i = 0; i < row; i++)
scanf("%s", field[i]);
dtoz(field);
findstar(field);
/* output */
if (set > 0)
printf("\n");
printf("Field #%d:\n", ++set);
for (i = 0; i < row; i++)
printf("%s\n", field[i]);
}
}
/* dtoz: change dot to '0' */
void dtoz(char (*field)[MAXLEN + 1])
{
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
if (field[i][j] == '.')
field[i][j] = '0';
}
/* findstar: find the position of '*' */
void findstar(char (*f)[MAXLEN + 1])
{
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
if (f[i][j] == '*')
add(f, i, j);
}
/* position: add one to the fields surround of '*' */
void add(char (*f)[MAXLEN + 1], int i, int j)
{
int mover[] = {1, 1, 1, 0, -1, -1, -1, 0};
int movec[] = {-1, 0, 1, 1, 1, 0, -1, -1};
int k, x, y;
for (k = 0; k < 8; k++) {
x = i + mover[k];
y = j + movec[k];
if (x >= 0 && x < row && y >= 0 && y < col)
NOTSTAR(f, x, y);
}
}
沒有留言:
張貼留言