自己写题目的思路,如果有错请各位指出。
一、题目
二、代码
#include<stdio.h>
#define N 1000
int main(){
int n,m;
int i,j,count;
char a[N][N];
scanf("%d%d",&n,&m);
getchar();
//输入数据
for(i=0; i<n; i++){
for(j=0; j<m; j++){
scanf("%c",&a[i][j]);
}
getchar();
}
//循环遍历每个值
for(i=0; i<n; i++){
for(j=0; j<m; j++){
count = 0;
if(a[i][j] == '*'){
printf("*");
continue;
}
//判断8个方向有没有雷,如果没有,count++
if(a[i-1][j-1] == '*') count++;
if(a[i-1][j] == '*') count++;
if(a[i-1][j+1] == '*') count++;
if(a[i][j-1] == '*') count++;
if(a[i][j+1] == '*') count++;
if(a[i+1][j-1] == '*') count++;
if(a[i+1][j] == '*') count++;
if(a[i+1][j+1] == '*') count++;
printf("%d",count);
}
printf("\n");
}
return 0;
}
三、思路
思路:
1、在读取字符矩阵之前,使用 getchar() 函数来消耗掉输入缓冲区中由前一个 scanf调用留下的换行符。 因为 scanf在读取整数后会在输入缓冲区中留下一个换行符,
2、在内层循环结束后,再次调用 getchar() 函数, 来消耗掉可能留在输入缓冲区中的换行符。 这是因为用户每输入一个字符后通常会按下回车键,产生一个换行符
3、两个循环(i,j)遍历每个坐标,如果该坐标a[i][j] == '*',说明是雷,不要判断,直接输出结束循环。4、如果该坐标a[i][j] != '*',说明不是雷,判断8个坐标轴方位,如果为 '*',则count++;最后输出count
核心原理:
//判断8个方向有没有雷,如果没有,count++
if(a[i-1][j-1] == '*') count++;
if(a[i-1][j] == '*') count++;
if(a[i-1][j+1] == '*') count++;
if(a[i][j-1] == '*') count++;
if(a[i][j+1] == '*') count++;
if(a[i+1][j-1] == '*') count++;
if(a[i+1][j] == '*') count++;
if(a[i+1][j+1] == '*') count++;