扫雷
Description
懒狗一学期只去一次早八,剩下的时间都用于玩一款名叫扫雷的游戏。在一幅 n×m 的方格图上,在某些方格上可能有地雷,而在没有地雷的地方则会有数字表示以这个点为中心的九宫格内有多少颗地雷。懒狗并不关心怎么通关游戏,反而好奇图上的数字总和是多少。
下面给出一幅扫雷图请帮助懒狗算出图上的数字总和。
Input
第一行包含两个整数 n, m(1≤n,m≤1000) 表示方格图的行数和列数。
接下来 n 行,每行包含 m 个字符,其中第 i 行第 j 个字符 ai,j 描述该位置是否为地雷,若 ai,j 为*
,则表示 (i, j)(i,j) 位置有地雷,否则若 ai,j 为.
,则表示 (i, j)(i,j) 位置没有地雷。
Output
输出共一行,包含一个数字,表示答案。
Sample Input 1
2 2 .. **
Sample Output 1
4
Hint
根据扫雷的规则,在第一行各有两个数字 2,故总和为 4。
可以用开一个方向向量,然后在判断有无越界来做,全部遍历一遍即可
#include<bits/stdc++.h>
using namespace std;
char a[1010][1010];
int main()
{
int n , m;
int cnt=0;
long long sum=0;
cin >> n >> m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> a[i][j];
int b[]={-1,-1,-1,0,0,1,1,1};
int c[]={-1,0,1,-1,1,-1,0,1};
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(a[i][j]=='.')
{
cnt=0;
for(int k=0;k<=7;k++)
{
int x = i + b[k], y = j + c[k];
if(x>=1 && x<=n && y>=1 && y<=m && a[x][y]=='*') cnt++;
}
sum+=cnt;
}
}
cout<<sum;
return 0;
}