zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
        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("
    ");
        }
    
        return 0;
    }
    
    /*
    4 4
    ?**?
    *?**
    ????
    ??*?
    2**3
    *4**
    1333
    01*1
    */




  • 相关阅读:
    社区运营一点事
    从拉动APP下载谈运营
    c#基础学习(0702)之面向对象和方法重写概述
    c#基础学习(0706)之使用虚方法实现多态
    c#基础学习(0703)之string.Format格式化日期
    c#基础学习(0701)之一些简单的方法练习
    c#基础学习(0630)之面向对象总习
    c#基础学习(0629)之导出Excel方法
    c#基础学习(0628)之使用进程打开指定的文件、模拟磁盘打开文件
    c#基础学习(0627)之类型转换、算数运算符++、--
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563897.html
Copyright © 2011-2022 走看看