首页 > 其他分享 >NKOJ 2110 美丽的星空

NKOJ 2110 美丽的星空

时间:2024-12-14 09:54:22浏览次数:2  
标签:多边形 星空 int NKOJ 全等 que 2110 505 cur

NKOJ 2110 美丽的星空

思路

  • 洪水填充(BFS) + 多边形全等的判定。

实现方法

  • 这道题比较复杂,分为三个步骤。
    1. 用 BFS 求出有哪些星座并编号。
    2. 两两判全等。
      • 多边形的全等判定定理:如果两多边形每两个点之间的距离和相等,则它们全等。
      • 如果两个多边形全等,就将新的打上旧的的标记。否则就打一种新的标记。

代码

#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
struct node{int x,y;};
int n,m,cur;
char ANS='a';
int arr[505][505];
int vis[505][505];
int xx[505][165],yy[505][165];
char ans[505][505];
//int dx[]={1,0,-1,0,-1,1,-1,1};
//int dy[]={0,1,0,-1,-1,1,1,-1};
double dis(int x1,int y1,int x2,int y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool check(int tyx,int lzh){
	double cnt1=0;
	for(int i=1;i<=xx[tyx][0];i++){
		for(int j=1;j<=xx[tyx][0];j++){
			cnt1+=dis(xx[tyx][i],yy[tyx][i],xx[tyx][j],yy[tyx][j]);
		}
	}
	double cnt2=0;
	for(int i=1;i<=xx[lzh][0];i++){
		for(int j=1;j<=xx[lzh][0];j++){
			cnt2+=dis(xx[lzh][i],yy[lzh][i],xx[lzh][j],yy[lzh][j]);
		}
	}
	if(abs(cnt1-cnt2)<0.000001) return 1;//注意点3
	else return 0;
}
void mark(int tyx,int lzh){
	for(int i=1;i<=xx[tyx][0];i++){
		ans[xx[lzh][i]][yy[lzh][i]]=ans[xx[tyx][i]][yy[tyx][i]];
	}
}
void book(int tyx){
	for(int i=1;i<=xx[tyx][0];i++){
		ans[xx[tyx][i]][yy[tyx][i]]=ANS;
	}
	ANS++;
}
void bfs(int x,int y){
	queue<node> que;
	que.push({x,y});
	vis[x][y]=cur;
	xx[cur][++xx[cur][0]]=x,yy[cur][++yy[cur][0]]=y;
	while(!que.empty()){
		node tp=que.front();
		que.pop();
		for(int i=-1;i<=1;i++){
			for(int j=-1;j<=1;j++){
				int tx=tp.x+i,ty=tp.y+j;
				if(tx>=0&&tx<=n&&ty>=0&&ty<=m&&vis[tx][ty]==0&&arr[tx][ty]!=0){
					xx[cur][++xx[cur][0]]=tx,yy[cur][++yy[cur][0]]=ty;
					vis[tx][ty]=cur;
					que.push({tx,ty});
				}
			}
		}
	}
}
int main(){
	scanf("%d%d",&m,&n);//注意点2
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) scanf("%1d",&arr[i][j]);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) if(vis[i][j]==0&&arr[i][j]!=0) cur++,bfs(i,j);
	}
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=m;j++){
//			if(vis[i][j]==0) printf("   ");
//			else printf("%.2d ",vis[i][j]);
//		}
//		puts("");
//	}
	for(int i=1;i<=cur;i++){
		int flag=0;
		for(int j=i-1;j>=1;j--){//注意点1
			if(check(i,j)){
				flag=1;
				mark(j,i);
			}
		}
		if(flag==0) book(i);
	}
//	book(1);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(vis[i][j]==0) printf("0");
			else printf("%c",ans[i][j]);
		}
		puts("");
	}

	return 0;
}

注意事项

  1. 注意在判全等时要外层从前往后判,内层从后往前判,这样才能时后面的按前面的标。
  2. 这道题有坑,要注意 \(n\) 和 \(m\) 在本题中输入是反的。
  3. 注意在判断距离和相等时,只需要判断绝对差异与 \(eps\) 的大小,由于误差,一般不可能完全相等。
  4. 本题在调试的时候注意分块,在写代码时注意模块化,每一个功能一个函数,方便调试每一个功能。

标签:多边形,星空,int,NKOJ,全等,que,2110,505,cur
From: https://www.cnblogs.com/hsr-ray-blog/p/18606404

相关文章

  • Python Turtle 实现动态时钟:十二时辰与星空流星效果
            在这篇文章中,我将带你通过Python的turtle模块构建一个动态可视化时钟程序。这个时钟不仅具备传统的时间显示功能,还融合了中国古代的十二时辰与八卦符号,并通过动态星空、流星效果与昼夜背景切换,为程序增添了观赏性和文化内涵。这是一次将现代编程技术与传统......
  • 星空模拟程序
    这个程序可以在控制台中模拟星空闪烁的效果,每次循环都会随机生成星星的位置并绘制,然后短暂停顿,给人以星空动态变化的感觉#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#include<conio.h> //函数声明,用于获取控制台窗口的宽度intgetC......
  • 金蝶云星空热更新
    第一步:创建项目第二步:点击开发后,选择项目然后右键选择搭建开发环境,版本号一定要一致第三步:开发环境搭建好后,创建插件创建VS插件时,要将位置更改到❌\WorkSpace\xxxx\xxxxxxx\Code\里面创建插件成功后,先更改输出路径写完代码后注册,绑定完成后启动开发环境就可以测试看效果......
  • 实现金蝶云星空到MySQL数据集成的技术方案
    金蝶云星空数据集成到MySQL的技术案例分享在企业信息化系统中,数据的高效流转和准确对接是业务流程顺畅运行的关键。本文将聚焦于一个具体的系统对接集成案例:如何通过轻易云数据集成平台,将金蝶云星空的数据无缝集成到MySQL数据库中。此次案例的实际运行方案为“zzcx-金蝶查询组装......
  • 数据集成案例:旺店通与金蝶云星空的无缝对接
    案例分享:旺店通·企业奇门数据集成到金蝶云星空在现代企业的运营中,数据的高效流动和准确同步是确保业务顺利进行的关键。本文将聚焦于一个具体的系统对接集成案例——如何通过轻易云数据集成平台实现旺店通·企业奇门的数据无缝同步到金蝶云星空。此次集成方案被命名为“仓库同......
  • 如何实现退货数据在聚水潭与金蝶云星空间的无缝集成
    如何实现退货数据在聚水潭与金蝶云星空间的无缝集成聚水潭退货入库单与金蝶云星空销售退货单的系统对接集成案例在企业日常运营中,数据的高效流转和准确处理是确保业务顺利进行的关键。本文将分享一个实际运行的系统对接集成案例:如何通过轻易云数据集成平台,将聚水潭的退货入......
  • 金蝶云星空批改单据体字段
    #引入clr运行库importclr#添加对cloud插件开发的常用组件的引用clr.AddReference('System')clr.AddReference('System.Data')clr.AddReference('Kingdee.BOS')clr.AddReference('Kingdee.BOS.Core')clr.AddReference('Kingdee.BOS.App'......
  • 金蝶云星空与新宝平台数据集成提升生产效率
    金蝶云星空与新宝平台数据集成提升生产效率金蝶云星空与新宝-产业链协同平台的数据集成案例分享在现代制造业中,数据的高效流动和精准对接是实现智能化生产的重要基础。本文将聚焦于一个具体的系统对接集成案例:如何通过轻易云数据集成平台,将金蝶云星空中的生产订单数据无缝......
  • 金蝶云星空——采购订单新变更单
    目录0.背景1.从采购订单查询相关的数据2.创建采购订单新变更单的JSON格式参数3.关于新变更单未生效版本的查询4.其他说明0.背景采购订单新变更单,不是通过下推创建的,而是通过业务操作-->修改变更进行创建的注意:若是采购订单中:业务查询按钮下没有:变更查询,则需要到“采购管......
  • 钉钉样机归还申请数据无缝集成到金蝶云星空
    钉钉样机归还申请数据无缝集成到金蝶云星空钉钉数据集成到金蝶云星空:Done-钉钉-样机归还申请——>金蝶-其他出库单在企业信息化管理中,数据的高效流转和精准对接是提升业务效率的关键。本文将分享一个具体的系统对接集成案例,即如何通过轻易云数据集成平台,将钉钉中的“样机归......