解题思路:
因为,测试数据有的雷块多,有的雷块少;这里加个判断使得函数调用最少:雷块少,调用用轰炸法,若安全块少,调用用排雷法;
2017-12-17 16-36-55屏幕截图.png

参考代码:

#include <stdio.h>
void Minesweeper( int x, int y );//轰炸法


void Sweepmine( int x, int y );//排雷法


int    X, Y, M, N = 0;
int    num_mine, num_safe; //分别记录雷快的数目,和安全块的数目
int    num = 1;
char    b[100][100];
/*-------------------------------------------------------------*/
int main()
{
    while ( scanf( "%d%d", &X, &Y ) && !(X == 0 && Y == 0) )
    {
        num_mine = 0; num_safe = 0;
        for ( int i = 0; i < X; i++ )
        {
            getchar(); /*clear data buffer cache*/
            for ( int j = 0; j < Y; j++ )
            {
                scanf( "%c", &b[i][j] );
                if ( b[i][j] == '.' )
                {
                    b[i][j] = '0';
                    num_safe++;
                }else
                    num_mine++;
            }
        }
        N++; /*the token of field;*/
        if ( num_mine <= num_safe ) //判断用哪种方法
        {
            for ( int i = 0; i < X; i++ )
                for ( int j = 0; j < Y; j++ )
                    if ( b[i][j] == '*' )
                        Minesweeper( i - 1, j - 1 );
            //printf( "Minesweeper!\n" );
        }else  {
            for ( int i = 0; i < X; i++ )
                for ( int j = 0; j < Y; j++ )
                    if ( b[i][j] != '*' )
                        Sweepmine( i - 1, j - 1 );
            //printf( "Sweepmine!\n" );
        }


        printf( "Field #%d:\n", N );
        for ( int i = 0; i < X; i++ )
            for ( int j = 0; j < Y; j++ )
            {
                printf( "%c", b[i][j] ); if ( (j + 1) % Y == 0 )
                    printf( "\n" );
            }
        printf( "\n" );
    }
}


/*-------------------------------------------------------------*/
void Minesweeper( int x, int y )
{
    for ( int i = x; i <= x + 2; i++ )
        for ( int j = y; j <= y + 2; j++ )
            if ( i >= 0 && i < X && j >= 0 && j < Y && b[i][j] != '*' )
                b[i][j] += 1;
    return;
}

/*-------------------------------------------------------------*/
void Sweepmine( int x, int y )
{
    for ( int i = x; i <= x + 2; i++ )
        for ( int j = y; j <= y + 2; j++ )
            if ( i >= 0 && i < X && j >= 0 && j < Y && b[i][j] == '*' )
                b[x + 1][y + 1] += 1;
    return;
}

别忘点赞哦-.-

点赞(35)
 

0.0分

34 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 14 条评论

SAK104832 1年前 回复TA
@初夕 轰炸法就是如果碰到炸弹了,就给炸弹周围不是炸弹的标记加一
白熊小将 1年前 回复TA
只能说太强了
uq_31596719879 2年前 回复TA
真大佬,NB,膜拜
过客 3年前 回复TA
用动态数组就更好了
菜鸡党怀疑智商 3年前 回复TA
大佬nb
初夕 3年前 回复TA
@初夕 谢谢您,我明白原理了,就是代码还有点问题
月儿会弯 3年前 回复TA
@初夕 这个轰炸法就是 以这个点为中心(不是*号点)周围八个位置中如果有哪个位置市*号 那么这个中心点就加一
月儿会弯 3年前 回复TA
@初夕 对不起 是我看错了眼花了
月儿会弯 3年前 回复TA
@初夕 这个轰炸法有问题 自己试试
初夕 3年前 回复TA
什么是轰炸法?没看懂轰炸法