其他分享
首页 > 其他分享> > 炸弹

炸弹

作者:互联网

【问题描述】
这是一个军事阵地,为具有 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