本人是第一次发博客,有错误的地方,请谅解。(最好是指出)
这道题主要是坐标点的算法。横坐标和纵坐标都要分别求出
看一下下面的矩阵,就是a[x][y]是‘*’的上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子的方位图
a[x-1][y-1] a[x-1][y] a[x-1][y+1]
a[x] [y-1] a[x][y](初始点) a[x][y+1]
a[x+1][y-1] a[x+1][y] a[x+1][y+1]
所以,为了更方便的去计算坐标点的横坐标和纵坐标,我们开两个数组。
int dx[]={1,0,-1,0,-1,1,1,-1};
int dy[]={0,1,0,-1,-1,-1,1,1};
【C++代码】
#include<stdio.h>
#include<iostream> //头文件
using namespace std;
char a[101][101]; //开数组
char b[101][101];
int n,m; //行,列
int dx[]={1,0,-1,0,-1,1,1,-1}; //横坐标的加减点
int dy[]={0,1,0,-1,-1,-1,1,1}; //纵坐标的加减点
void lt(int x,int y) //开一个算周围方块++的函数
{
int nx,ny;
for (int k=0;k<8;k++)
{
nx=x+dx[k]; //每个坐标点算出并存储
ny=y+dy[k];
if (nx>=1&&nx<=n&&ny>=1&&ny<=m) //判断边界
{
b[nx][ny]++; //周围方块++
}
}
}
int main()
{
scanf("%d%d",&n,&m); //输入行,列
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cin>>a[i][j]; //输入每个点
}
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if(a[i][j]=='?') //判断是不是‘?’
{
a[i][j]=0; //是,就归为 0
}
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (a[i][j]=='*') //判断是不是‘*’
{
lt(i,j); //是‘*’就放到lt函数里计算
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
if (a[i][j]=='*')
{
printf("*");
}
else
{
printf("%d",b[i][j]);
}
}
printf("\n"); //注意换行
}
return 0;
}
欢迎借鉴