2019年蓝桥杯练习2-扫雷
2019年蓝桥杯练习2-扫雷
Minesweeper (扫雷)
PC/UVa IDs: 110102/10189,
Popularity: A,
Success rate: high Level: 1
测试地址:https://vjudge.net/problem/UVA-10189
描述:
//每周一练/2
#include<stdio.h>
#define MAX 100
int fun(char M[MAX][MAX],int n, int m, int i, int j) { //当前点不是雷时,判断当前点周围雷的个数
int num=0;
//当前点周围即 i-1 ~ i+1,j-1 ~ j+1 ,(这里遍历了当前区域的9个点,包含当前点(肯定不是雷))
for(int a=i-1;a<=i+1;a++) {
for(int b=j-1;b<=j+1;b++) {
if(a>=0 && b>=0 && a<n && b<m && M[a][b]=='*') { //注意做边界判断
num++;
}
}
}
return num;
}
int main()
{
int n,m,count=1;
while(scanf("%d %d",&n,&m)==2 && n && m ) {
char Mines[MAX][MAX];
int i,j;
for(i=0;i<n;i++) { //注意一下二维字符数组的输入方式
scanf("%s",Mines[i]);
}
if(count>1) printf("\n"); //添加这一行代码测试才会AC,不加这一行状态会为Presentation erro,不太理解。。。
printf("Field #%d:\n",count);
//遍历二维数组
for(i=0;i<n;i++) {
for(j=0;j<m;j++) {
if(Mines[i][j]=='.') { //如果不是雷,执行fun函数返回当前点周围的雷的个数
printf("%d",fun(Mines,n,m,i,j));
}
if(Mines[i][j]=='*'){ //如果是雷,直接输出*
printf("*");
}
}
printf("\n");
}
count++;
}
return 0;
}
主要是注意一下二维字符数组的输入技巧