炸弹
作者:互联网
【问题描述】
这是一个军事阵地,为具有 n × m 个分块单元的方形区域,每个单元既可以是空(用“.”表示),或者可以被墙(用“”表示)占用。
有一颗炸弹,如果将其放在单元 (x, y)上,引爆后将摧毁 x 行和 y 列上所有的墙。
请确定放置并引爆一颗炸弹是否可以摧毁所有的墙,其中炸弹可以放置在空的单元,也可以放置在被墙占用的单元。
【输入形式】
输入的第一行一个整数 T,表示测试用例数。
对于每个测试用例,输入的第一行包含两个整数 n 和 m (1 ≤ n, m ≤ 1000),表示区域的行数和列数。
接下来的 n 行,每行包含 m 个符号 “.” 或 "",表示区域上第 i 行第 j 列上的符号。
【输出形式】
输出有 T 行,每行对应一个测试用例的结果,如果不可能摧毁所有的墙,则输出"NO",否则输出"YES"。
【样例输入】
2
3 4
.*..
....
.*..
3 3
..*
.*.
*..
【样例输出】
YES
NO
解题思路:
求出一点所在行和所在列能否覆盖所有的*,所以先把每行和每列的*数求出来,在遍历每个位置判断该点是否符合条件
注意:如果该点是*,则判断时考虑该点多数了一次
#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool func()
{
int n, m, num = 0;
cin >> n >> m;
vector<int> nArr(n); //储存每行的*个数
vector<int> mArr(m); //储存每列的*个数
vector<vector<char> > arr(n, vector<char>(m)); //n*m的数列
for (int i = 0; i < n; i++)
{
nArr[i] = 0;
for (int j = 0; j < m; j++)
{
cin >> arr[i][j];
if (arr[i][j] == '*') num++, nArr[i]++; //求*的总数 和每行行*的总数
}
}
for (int i = 0; i < m; i++)
{
mArr[i] = 0;
for (int j = 0; j < n; j++)
{
if (arr[j][i] == '*') mArr[i]++; //求每列的*总数
}
}
for (int i = 0; i < n; i++) //遍历在每个位置时 所在行和所在列的 * 是否 == *总数
{
for (int j = 0; j < m; j++)
{
if (arr[i][j] == '*') //十字交叉点有 * 则多数一个 *
{
if (nArr[i] + mArr[j] == num + 1)
{
return true;
}
}
else //十字交叉点是空白
if (nArr[i] + mArr[j] == num)
{
return true;
}
}
}
return false;
}
int main()
{
int n;
cin >> n;
vector<int> result(n);
for (int i = 0; i < n; i++)
{
result[i] = func();
}
for (int i = 0; i < n; i++)
{
if (result[i] == 1)
{
cout << "YES" << endl;
}
else
cout << "NO" << endl;
}
}
标签:arr,vector,++,nArr,int,炸弹,mArr 来源: https://blog.csdn.net/m0_52867423/article/details/112279580