原题链接:Minesweeper
本人没有学习过数据结构,也没有系统的学习过算法竞赛相关的知识,所以只能用最朴素的思想来解决这道题。
说实话,这个题目英文翻译之后我也看不懂,看了输入输出样例反而更容易看懂意思,所以有时看不懂题的话,不妨结合输入输出样例来理解题目。
这题思路很清晰,我们可以定义一个m*n的二维数组a用于存放每一行,千万记得要定义成[m][n+1]。然后再定义另一个二维数组b,用于存放输出的内容。然后就是一个一个方块来分析了,如果是'*',则直接将b中对应的位置赋值'*',否则对其周边方块进行分析。
这题最麻烦的点就在这里,你需要考虑四条边上的方块的周边,因为它们并不是8个,所以需要用判断条件来控制,这一步做好了,整个程序的构造其实就十分明了了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int m, n, flag=1; //行,列,场的序号
while(1)
{
int num; //周边雷的数目
scanf("%d%d",&m,&n);
getchar();
if(m==0&&n==0)
break;
char a[m][n+1]; //放雷和安全砖块
char b[m][n]; //记录每个砖块的数字
int i, j, k, l; //控制行和列的循环变量,后两个用来搜索周边区域
for(i=0;i<m;i++)
gets(a[i]); //输入每一行
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='*') //是雷
b[i][j]='*';
else
{
num=0; //初始化,很重要!
for(k=i-1;k<=i+1;k++)
{
if(k<0) //越境判断
continue;
if(k>m-1)
break;
for(l=j-1;l<=j+1;l++)
{
if(l<0)
continue;
if(l>n-1)
break;
if(a[k][l]=='*')
num++;
}
}
b[i][j]=num+'0';
}
}
}
printf("Field #%d:\n",flag++);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%c",b[i][j]);
}
printf("\n");
}
printf("\n"); //格式错的看看是不是漏了这里的换行
}
return 0;
}
5 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复