解题思路:遍历所有格子.把有雷的格子周围的空格计数+1.
代码:
#include <stdio.h>
#include <stdlib.h>
void MinesInCorner(char **,int,int);
void MinesInSide(char **,int,int);
void MinesInMiddle(char **,int,int);
void PrintfMines(char **,int,int);
int main()
{
int M,N;
int i,j;
int fieldcount =0;
char **mines = NULL; //表示扫雷区域
do{
scanf("%d%d",&M,&N);
getchar();
if(M == 0) //判断是否为结束标志
break;
fieldcount++;
if(fieldcount > 1)
printf("\n");
mines = (char **)malloc(sizeof(char *) * M);
for(i=0;i<M;i++)
mines[i] = (char *)malloc(sizeof(char) * (N+1));
/* 读入雷区信息 */
for(i=0;i<M;i++)
{
gets(mines[i]);
}
/* 将非雷的方格置为0 */
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
if(mines[i][j] == '.')
mines[i][j] = '0';
}
/* 统计每个方格附近的雷数 */
if(M > 2 && N > 2)
{
MinesInCorner(mines,M,N);
MinesInSide(mines,M,N);
MinesInMiddle(mines,M,N);
}else if( M == 2 && N == 2)
{
MinesInCorner(mines,M,N);
}else if(M == 1 && N >= 2)
{
if(mines[0][0] == '*')
{
if(mines[0][1] != '*')
mines[0][1]++;
}
if(mines[0][N-1] == '*')
{
if(mines[0][N-2] != '*')
mines[0][N-2]++;
}
for(i=1;i<N-1;i++)
{
if(mines[0][i] == '*')
{
if(mines[0][i-1] != '*')
mines[0][i-1]++;
if(mines[0][i+1] != '*')
mines[0][i+1]++;
}
}
}else if(M >= 2 && N == 1)
{
if(mines[0][0] == '*')
{
if(mines[1][0] != '*')
mines[1][0]++;
}
if(mines[M-1][0] == '*')
{
if(mines[M-2][0] != '*')
mines[M-2][0]++;
}
for(i=1;i<M-1;i++)
{
if(mines[i][0] == '*')
{
if(mines[i-1][0] != '*')
mines[i-1][0]++;
if(mines[i+1][0] != '*')
mines[i+1][0]++;
}
}
}
/* 输出统计后的雷区信息 */
printf("Field #%d:\n",fieldcount);
PrintfMines(mines,M,N);
for(i=0;i<M;i++)
free(mines[i]);
free(mines);
}while(1);
return 0;
}
/***************************************/
void MinesInCorner(char ** A,int M,int N)
{
/* 判断左上角 */
if(A[0][0] == '*')
{
if(A[1][1] != '*')
A[1][1]++;
if(A[1][0] != '*')
A[1][0]++;
if(A[0][1] != '*')
A[0][1]++;
}
/* 判断左下角 */
if(A[M-1][0] == '*')
{
if(A[M-2][0] != '*')
A[M-2][0]++;
if(A[M-1][1] != '*')
A[M-1][1]++;
if(A[M-2][1] != '*')
A[M-2][1]++;
}
/* 判断右上角 */
if(A[0][N-1] == '*')
{
if(A[0][N-2] != '*')
A[0][N-2]++;
if(A[1][N-1] != '*')
A[1][N-1]++;
if(A[1][N-2] != '*')
A[1][N-2]++;
}
/* 判断右下角 */
if(A[M-1][N-1] == '*')
{
if(A[M-1][N-2] != '*')
A[M-1][N-2]++;
if(A[M-2][N-1] != '*')
A[M-2][N-1]++;
if(A[M-2][N-2] != '*')
A[M-2][N-2]++;
}
}
/*******************************************/
void MinesInSide(char ** A,int M,int N)
{
int i;
/* 判断上边 */
for(i=1;i<N-1;i++)
{
if(A[0][i] == '*')
{
if(A[0][i-1] != '*')
A[0][i-1]++;
if(A[0][i+1] != '*')
A[0][i+1]++;
if(A[1][i-1] != '*')
A[1][i-1]++;
if(A[1][i] != '*')
A[1][i]++;
if(A[1][i+1] != '*')
A[1][i+1]++;
}
}
/* 判断下边 */
for(i=1;i<N-1;i++)
{
if(A[M-1][i] == '*')
{
if(A[M-1][i-1] != '*')
A[M-1][i-1]++;
if(A[M-1][i+1] != '*')
A[M-1][i+1]++;
if(A[M-2][i-1] != '*')
A[M-2][i-1]++;
if(A[M-2][i] != '*')
A[M-2][i]++;
if(A[M-2][i+1] != '*')
A[M-2][i+1]++;
}
}
/* 判断左边 */
for(i=1;i<M-1;i++)
{
if(A[i][0] == '*')
{
if(A[i-1][0] != '*')
A[i-1][0]++;
if(A[i+1][0] != '*')
A[i+1][0]++;
if(A[i][1] != '*')
A[i][1]++;
if(A[i-1][1] != '*')
A[i-1][1]++;
if(A[i+1][1] != '*')
A[i+1][1]++;
}
}
/* 判断右边 */
for(i=1;i<M-1;i++)
{
if(A[i][N-1] == '*')
{
if(A[i-1][N-1] != '*')
A[i-1][N-1]++;
if(A[i+1][N-1] != '*')
A[i+1][N-1]++;
if(A[i][N-2] != '*')
A[i][N-2]++;
if(A[i+1][N-2] != '*')
A[i+1][N-2]++;
if(A[i-1][N-2] != '*')
A[i-1][N-2]++;
}
}
}
/*******************************************/
void MinesInMiddle(char ** A,int M,int N)
{
int i,j;
for(i=1;i<M-1;i++)
{
for(j=1;j<N-1;j++)
{
if(A[i][j] == '*')
{
if(A[i-1][j-1] != '*')
A[i-1][j-1]++;
if(A[i-1][j] != '*')
A[i-1][j]++;
if(A[i-1][j+1] != '*')
A[i-1][j+1]++;
if(A[i][j-1] != '*')
A[i][j-1]++;
if(A[i][j+1] != '*')
A[i][j+1]++;
if(A[i+1][j-1] != '*')
A[i+1][j-1]++;
if(A[i+1][j] != '*')
A[i+1][j]++;
if(A[i+1][j+1] != '*')
A[i+1][j+1]++;
}
}
}
}
/*******************************************/
void PrintfMines(char ** A,int M,int N)
{
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
printf("%c",A[i][j]);
}
printf("\n");
}
}
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:803 |
川哥的吩咐 (C++代码)浏览:1059 |
C语言训练-大、小写问题 (C语言代码)浏览:2416 |
简单的a+b (C语言代码)浏览:712 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:640 |
【密码】 (C语言代码)浏览:345 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:665 |
【出圈】 (C语言代码)浏览:818 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:603 |
WU-复数求和 (C++代码)浏览:2111 |