【模拟】军训

【题目描述】

小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");
	}
}

猜你喜欢

转载自blog.csdn.net/Dy_Dream/article/details/83002046