Manchester


私信TA

用户名:wenyajie

访问量:332155

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 65567
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
因为,测试数据有的雷块多,有的雷块少;这里加个判断使得函数调用最少:雷块少,调用用轰炸法,若安全块少,调用用排雷法;
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;
}

别忘点赞哦-.-

 

0.0分

40 人评分

  评论区

只能说太强了
2023-05-22 11:06:08
真大佬,NB,膜拜
2022-12-04 16:54:24
用动态数组就更好了
2021-12-07 14:21:00
大佬nb
2021-04-18 16:43:35
什么是轰炸法?没看懂轰炸法
2021-02-01 09:58:31
NB
2021-01-05 10:39:05
第20行 getchar()的作用能详细说一下嘛,谢谢。
2019-06-05 23:27:08
我只想问怎么想到的,数据这么巧妙的写起来了?大佬
2019-03-17 16:24:04
  • «
  • 1
  • »