CCF NOI1054 扫雷游戏

问题链接CCF NOI1054 扫雷游戏




时间限制: 1000 ms  空间限制: 262144 KB

题目描述 

  扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。
  现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。
  注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。

输入

  第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。
  接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符

输出

  n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。

样例输入

3 3
*??
???
?*?
样例输出

*10
221
1*1

数据范围限制

  1 <= n <= 100, 1 <= m <= 100。




问题分析

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

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

程序说明

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

  这里给出两种计算地雷数量的方法,分别编写程序。

要点详解
  • 先定义一个符号常量,再用它来定义二维数组,可以使得程序的通用性得到提高
  • 一些编程技巧有助于简化程序的代码
  • 函数memset()用于给大量的存储空间设置初始值是方便的。
  • 数组around[]存储周围元素的相对下标,使得无序变有序,可以用循环来处理。



参考链接:(略)。

100分通过的C语言程序之一:

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

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

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

int main(void)
{
    int n, m, i, j, k;

    memset(a, 0, sizeof(a));

    scanf("%d%d", &n, &m);
    for(i=1; i<=n; i++)
        scanf("%s", a[i]+1);

    for(i=1; i<=n; i++) {
        for(j=1; j<=m; j++) {
            int count = 0;
            if(a[i][j] == '*')
                printf("%c", a[i][j]);
            else {
                for(k=0; k<AN; k++)
                    if(a[i + around[k].drow][j + around[k].dcol] == '*')
                        count++;
                printf("%d", count);
            }
        }
        printf("\n");
    }
    return 0;
}

100分通过的C语言程序之二:

#include <stdio.h>

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

#define N 100

char a[N+2][N+2];

int main(void)
{
    int n, m, i, j, k;

    scanf("%d%d", &n, &m);
    for(i=1; i<=n; i++)
        scanf("%s", a[i]+1);

    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            if(a[i][j] != '*')
                a[i][j] = 0;

    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            if(a[i][j] == '*')
                for(k=0; k<AN; k++)
                    if(a[i + around[k].drow][j + around[k].dcol] != '*')
                        a[i + around[k].drow][j + around[k].dcol]++;

    for(i=1; i<=n; i++) {
        for(j=1; j<=m; j++)
            if(a[i][j] == '*')
                printf("%c", a[i][j]);
            else
                printf("%d", a[i][j]);
        printf("\n");
    }

    return 0;
}

/*
4 4
?**?
*?**
????
??*?
2**3
*4**
1333
01*1
*/




posted on 2017-04-26 04:11  海岛Blog  阅读(506)  评论(0编辑  收藏  举报

导航