原题链接:Minesweeper
解题思路:
因为,测试数据有的雷块多,有的雷块少;这里加个判断使得函数调用最少:雷块少,调用用轰炸法,若安全块少,调用用排雷法;
参考代码:
#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分
34 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复