当前位置 : 主页 > 编程语言 > java >

B. Minesweeper 思维 二种思路

来源:互联网 收集:自由互联 发布时间:2022-07-04
​​传送门​​​ 题意:模拟扫雷步骤,有雷的去标记,看是否存在标记错误的情况。 扫雷的规则是:如果一个区域八种方向存在雷的话,这个地方就要标记上数字,有几个雷标记几

​​传送门​​​ 题意:模拟扫雷步骤,有雷的去标记,看是否存在标记错误的情况。
扫雷的规则是:如果一个区域八种方向存在雷的话,这个地方就要标记上数字,有几个雷标记几。
思路;
两种思路:
一:开两个数组,将字符型数组转化为整型数组,
一个数组存原图,将’.‘全转化为0。其余的字符数字-‘0’转化为整形。
遍历原来的数组,遇到‘*'就将八个方向不是雷的区域-1.
最后扫一遍整形图,如果有不等于0的区域就直接NO即可。
二:在原图的基础上修改,遇到’.‘就将其变为0,遇到数字就-‘0’转化为整形。最后在原数组上进行遍历,遇到数字去找雷,如果雷的个数不等于数字个数,那么直接NO -> return 0.
第一种:

#include <bits/stdc++.h>
#define ll long long
const int maxn = 1e5 + 5;
using namespace std;
char a[105][105];
int b[105][105];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];
if (a[i][j] == '.')
b[i][j] = 0;
else if(a[i][j]!='*')
b[i][j]=a[i][j]-'0';
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (a[i][j] == '*')
{
if (a[i][j + 1] != '*')
b[i][j+1]--;
if (a[i][j - 1] != '*')
b[i][j-1]--;
if (a[i + 1][j] != '*')
b[i+1][j]--;
if (a[i - 1][j] != '*')
b[i-1][j]--;
if (a[i + 1][j + 1] != '*')
b[i+1][j+1]--;
if (a[i + 1][j - 1] != '*')
b[i+1][j-1]--;
if (a[i - 1][j + 1] != '*')
b[i-1][j+1]--;
if (a[i - 1][j - 1] != '*')
b[i-1][j-1]--;
}
bool flag = 1;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++)
if(b[i][j]!=0)
{cout << "NO" << endl;
//system("pause");
return 0;}
}
cout << "YES" << endl;
//system("pause");
return 0;
}

第二种:

#include <bits/stdc++.h>
#define ll long long
const int maxn = 1e5 + 5;
using namespace std;
char a[105][105];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];
if (a[i][j] == '.')
a[i][j] = 0;
else if (a[i][j] != '*')
a[i][j] -= '0';
}
int cnt = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (a[i][j] != '*')
{
if (a[i + 1][j] == '*')
cnt++;
if (a[i - 1][j] == '*')
cnt++;
if (a[i][j + 1] == '*')
cnt++;
if (a[i][j - 1] == '*')
cnt++;
if (a[i + 1][j + 1] == '*')
cnt++;
if (a[i + 1][j - 1] == '*')
cnt++;
if (a[i - 1][j + 1] == '*')
cnt++;
if (a[i - 1][j - 1] == '*')
cnt++;
if (cnt != a[i][j])
{
cout << "NO" << endl;
return 0;
}
cnt=0;
}
cout<<"YES"<<endl;
//system("pause");
return 0;
}


上一篇:计蒜客 补码 模拟题
下一篇:没有了
网友评论