题目
【问题描述】
这是一个军事阵地,为具有 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>
using namespace std;
struct wall
{
int x,y;
};
int main()
{
int T;cin>>T;
for(int pass=0;pass<T;pass++)
{
int n,m,c=0,flag=2;cin>>n>>m;
string s;wall b[n*m];
for(int i=0;i<n;i++)
{
cin>>s;
for(int j=0;j<(int)s.length();j++)
if(s[j]=='*')
{
b[c].x=i;b[c].y=j;
c++;
}
}
if(c==0||c==1||c==2) ;
else
{
for(int i=0;i<c-1;i++)
{
for(int j=i+1;j<c;j++)
if(b[j].x!=b[i].x)
for(int k=j+1;k<c;k++)
if(b[k].x==b[j].x)
{flag--;break;}
if(flag==0) break;
}
}
if(flag==0) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}