UVALive4604 Minesweeper【水题】

Minesweeper is a game played on a R × C rectangular board. Some of the cells contain mines, andothers are empty. For each empty cell, calculate the number of its adjacent cells that contain mines.Two cells are adjacent if they share a common edge or point. This means that each cell has a maximumof 8 neighbors (up, down, left, right, four diagonals).

Input

There will be multiple test cases. The first line of each test case will have two integers, R and C(1 ≤ R, C ≤ 100), indicating the number of rows and columns of the board. The next R lines eachcontain exactly C characters. Each character is either a ‘*’ (asterisk) indicating a mine, or a ‘.’ (period)indicating an empty cell. The last data set is followed by a line containing two ‘0’s.

Output

Print each board on R lines with C characters per line, and replace every ‘.’ with the appropriate digitindicating the number of adjacent cells that contain mines. Leave the ‘*’ cells intact. Do not print anywhitespace between cells. Do not print any blank lines between answers.

Sample Input

3 2

..

.*

..

5 5

*.*.*

..*..

*****

.....

..**.

0 0

Sample Output

11

1*

11

*3*3*

36*63

*****

24553

01**1


Regionals 2009 >> North America - Southeast USA


问题链接UVALive4604 Minesweeper

问题简述:(略)

问题分析

  扫雷游戏是人们熟知的一个计算机游戏,通过这个程序,可以了解其局部的计算是如何实现的。

  这是一个简单的计算问题,对于一个位置,直接计算其周围的地雷数量即可。

程序说明

  定义二维数组用于存储扫雷游戏的棋盘时,周围多出一圈,可以省去数组下标的越界判定。  

  数组around[]存储周围元素的相对下标,使得无序变有序,可以用循环来处理。

题记:(略)

参考链接:(略)


AC的C++语言程序如下:

/* UVALive4604 Minesweeper */

#include <stdio.h>
#include <string.h>

#define AN 8
struct _around {
    int drow;
    int dcol;
} around[] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};

#define N 100
char a[N+2][N+2];

int main(void)
{
    int r, c, i, j, k;

    while(~scanf("%d%d", &r, &c) && (r || c)) {
        memset(a, 0, sizeof(a));

        for(i=1; i<=r; i++)
            scanf("%s", a[i]+1);

        for(i=1; i<=r; i++) {
            for(j=1; j<=c; j++) {
                int count = 0;
                if(a[i][j] != '*') {
                    for(k=0; k<AN; k++)
                        if(a[i + around[k].drow][j + around[k].dcol] == '*')
                            count++;
                    a[i][j] = count + '0';
                }
            }
        }

        for(i=1; i<=r; i++)
            printf("%s\n", a[i] + 1);
    }

    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值