【题目描述】
小L正在参加学校组织的军训。军训的操场是一个n*m的网格,每个网格开始时都没有人。每次军官会指定某些行和列,并在这些行和列的每个交界处都安排站上一名学生。但为了防止两名学生站到同一个网格中,军官每次指定的行和列并不会和之前指定过的重复。军官接到了上级的要求,需要将学生摆成特定的图案,那么军官能否达成要求呢?
【输入格式】
第一行一个整数T,表示数据组数。
接下来每个数据第一行两个整数n,m,意义如题面所述。
接下来n行,每行一个长度为n的字符串,其中第j个字符是’#’则代表i行j列的网格上要有学生,如果是’.’则代表没有。
【输出格式】
对于每组数据一行一个字符串“Yes”或者”No”,表示能否达到要求。
对于每一个位置,如果该处有学生,则这两条横竖线一定要相交,而这条竖线可能与上面的横线也相交,因为不会重复,所以这两行一定得在某一次中同时与这一列相交,而这两行又各有必须相交的线,而如果这些线不同,则显然无解,即某一列上任意存在学生的两行之间必须相同,判断一下能否满足条件即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,t;
int next[2005],sum[2005];
char s[2005][2005];
int main()
{
scanf("%d",&t);
while(t--)
{
bool flag=0;
scanf("%d%d",&n,&m);
memset(next,0,sizeof(next));
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
}
for(int i=1;i<=n;i++)
{
int now=0;
for(int j=0;j<m;j++)
{
if(s[i][j]=='#')
{
sum[i]++;
if(!next[j]) next[j]=i;
else
{
if(!now) now=next[j];
else if(now!=next[j])
{
flag=1;
break;
}
}
}
}
if(now!=0&&sum[now]!=sum[i]) flag=1;
if(flag) break;
}
if(flag) printf("No\n");
else printf("Yes\n");
}
}