【问题描述】
这是一个军事阵地,为具有 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;
int main()
{
int T;
cin>>T;
for(int j=0;j<T;j++)
{
int i,l,n,m;
cin>>n>>m;
char a[n][m];
for(i=0;i<n;i++)
{
for(l=0;l<m;l++)
{
cin>>a[i][l];
}
}
int *b=new int[n+m];
int k=0,K=0,g=0;
for(i=0;i<n;i++)
{
for(l=0;l<m;l++)
{
if(a[i][l]=='*')
{
b[k]=(i+1)*10+l+1;
g=k+1;
k+=1;
}
}
}
if(g<=2)
{
cout<<"YES"<<endl;
}
else
{
int N=0,M=0;
for(i=0;i<g;i++)
{
for(k=0;k<g&&k!=i;k++)
{
if(b[i]/10==b[k]/10)
{
N=b[i]/10;
break;
}
}
if(N!=0)
break;
}
for(i=0;i<g;i++)
{
for(k=0;k<g&&k!=i;k++)
{
if(b[i]%10==b[k]%10)
{
M=b[i]%10;
break;
}
}
if(M!=0)
break;
}
for(i=0;i<g;i++)
{
if(b[i]/10==N||b[i]%10==M)
{
K=0;
continue;
}
else
{
K=1;
break;
}
}
if(K==1)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
}
return 0;
}