zoj 3780 Paint the Grid Again 拓扑排序

博客围绕zoj 3780题目展开,题目要求从空白n*n矩形通过涂一行X或一列O变成给定矩形,输出字典序最小方案。解题思路是反向思考,类似拓扑排序,设R、C数组记录度数,将度数为0的点进队,出队点会使相关点度数减一,度数为0的点再入队。

zoj 3780

题意:你可以一行全涂X,也可以一列全涂O,可以覆盖,输出字典序最小的一个涂色方案,使得从一个空白的n*n的矩形可以变成给定的矩形。

思路:正过来想不好想,可以反过来想,如果一行全为X,那么这一行肯定是最后涂的,那么就把这一行X全部擦掉,如果这一步造成某一列只剩下O,那么剩下的涂色方案中,这一列是最后涂的颜色,这么一想,有点像拓扑排序,设R数组度数为每一行O的个数,C数组度数为每一列X的个数,那么接下来要做的就是拓扑排序,将所有度数为0的点进队,如果出队点R[ i ],接下来会造成所有的C点度数减一,如果有一个点C[ j ]的度数因此变为0,将C[ j ]入队即可。每次出队点C[ i ],也会造成多有的R点度数减一,同理。

#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
const int maxn=505;
char s[maxn][maxn];
int n,r[maxn],c[maxn];
struct node
{
	char c;
	int num;
	bool operator<(const node& t)const//优先队列输出字典序最大,然后用栈变成字典序最小 
	{                                  
		if(c==t.c)
		return num<t.num;
		return c<t.c;
	}
}no;
void toposort()
{
	stack<node>sta;
	priority_queue<node>q;
	for(int i=1;i<=n;i++)
	if(!r[i])
	q.push((node){'R',i});
	else if(!c[i])
	q.push((node){'C',i});
	int cnt1=0,cnt2=0;//分别记录涂了的行数和列数 
	while(!q.empty())
	{
		no=q.top();q.pop();
		if(cnt1<n&&cnt2<n)sta.push(no);//如果行数涂满了或者列数涂满了,就不用涂色了 
		if(no.c=='R')cnt1++;
		else cnt2++;
		if(no.c=='R')
		for(int i=1;i<=n;i++)
		{
			c[i]--;
			if(!c[i])
			q.push((node){'C',i});
		}
		else
		for(int i=1;i<=n;i++)
		{
			r[i]--;
			if(!r[i])
			q.push((node){'R',i});
		}
	}
	int flag=1;
	for(int i=1;i<=n;i++)if(r[i]>0||c[i]>0)flag=0;//有些点的度数不为0,无解 
	if(!flag)
	puts("No solution");
	else
	while(!sta.empty())
	{
		no=sta.top();
		sta.pop();
		printf("%c%d",no.c,no.num);
		if(!sta.empty())
		printf(" ");
		else
		puts("");
	}
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		scanf("%s",s[i]+1);
		for(int i=1;i<=n;i++)
		{
			int cnt1=0,cnt2=0;
			for(int j=1;j<=n;j++)
			{
				if(s[i][j]=='O')
				cnt1++;
				if(s[j][i]=='X')
				cnt2++;
			}
			r[i]=cnt1,c[i]=cnt2;
		}
		toposort();
	}
}

 

打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 HFSS,其全称为High Frequency Structure Simulator,是由Ansys公司研发的一款高级三维电磁场仿真软件,主要应用于射频、微波以及光学领域内的设计工作与性能分析。当前压缩包内提供的是一个基于HFSS软件构建的偶极子天线模型,并且包含了该模型的仿真数据,我们将对这一模型及其关联的学术知识进行细致的探讨。偶极子天线属于天线设计中最基础的类型之一,其结构由两个大小相等且布局对称的导体单元构成,整体形状类似于汉字“工”。在2.4GHz的频率条件下,此类天线被广泛部署于Wi-Fi、蓝牙等无线通信系统的构建中。HFSS软件能够对偶极子天线的电气特性进行高精度模拟,涵盖辐射模式、增益水平、方向图形态、输入阻抗以及S参数等多个核心指标。 S参数(即Scattering Parameters),是用于评估天线或微波器件输入端与输出端之间相互影响程度的关键参数。S参数详细刻画了信号流经网络设备时的反射与传输状态,其中S11(输入反射系数)和S21(传输系数)是最为常用的两种表征方式。借助HFSS软件执行S参数仿真,可以获取天线在多种频率下的反射与传输特性表现,从而协助设计人员对天线的阻抗匹配程度和运行效率进行有效评估。在此模型中,S参数仿真工作业已完成,因此我们可以直接审视2.4GHz频率下的阻抗匹配状况,以验证天线在该工作频段内能否展现出理想的性能。 在"Project1_1.aedt"与"Project1.aedt"这两个提供的文件中,储存了HFSS项目的完整信息。这些文件内含了天线的几何构造细节、材料物理属性、边界约束条件、求解器配置参数以及仿真获取的结果...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙橘子猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值