【问题描述】
这是一个军事阵地,为具有 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;
char map[1001][1001];
int main()
{
int T;
cin>>T;
for(int i=0; i<T; ++i)
{
int n,m,markx[2],marky[2],flag[2]= {0,0},t=0;
cin>>n>>m;
for(int x=0; x<n; ++x)
{
for(int y=0; y<m; ++y)
{
cin>>map[x][y];
if((flag[0]==0||flag[1]==0)&&map[x][y]=='*')
{
if(t<2)
{
markx[t]=x;
marky[t]=y;
t++;
}
else
{
if(markx[0]==markx[1])
{
if(x!=markx[0])
{
if(y==marky[0]) flag[0]=1;
else
{
markx[1]=x;
marky[1]=y;
}
}
}
else if(marky[0]==marky[1])
{
if(y!=marky[0])
{
if(x==markx[0]) flag[1]=1;
else
{
markx[1]=x;
marky[1]=y;
}
}
}
else
{
if(x!=markx[0]||y!=marky[1]) flag[0]=1;
if(x!=markx[1]||y!=marky[0]) flag[1]=1;
}
}
}
}
}
if(flag[0]==0||flag[1]==0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}