热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TZOJ5113:StarryNight

5113:StarryNight时间限制(普通Java):1000MS3000MS内存限制:65536KByte总提交:3测试通过:3描述Highupinthenightsky,t

5113: Starry Night 技术分享图片


时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 3            测试通过:3

描述


High up in the night sky, the shining stars appear in clusters of various shapes. A cluster is a non-empty group of neighbouring stars, adjacent in horizontal, vertical or diagonal direction. A cluster cannot be a part of a larger cluster.

Clusters may be similar. Two clusters are similar if they have the same shape and number of stars, irrespective of their orientation. In general, the number of possible orientations for a cluster is eight, as Figure 1 exemplifies.

技术分享图片 
Figure 1. Eight similar clusters

The night sky is represented by a sky map, which is a two-dimensional matrix of 0‘s and 1‘s. A cell contains the digit 1 if it has a star, and the digit 0 otherwise.

Given a sky map, mark all the clusters with lower case letters. Similar clusters must be marked with the same letter; non-similar clusters must be marked with different letters.

You mark a cluster with a lower case letter by replacing every 1 in the cluster by that lower case letter.


输入


The first two lines contain, respectively, the width W and the height H of a sky map. The sky map is given in the following H lines, of W characters each.


Constraints

0 <= W (width of the sky map) <= 100
0 <= H (height of the sky map) <= 100
0 <= Number of clusters <= 500
0 <= Number of non-similar clusters <= 26 (a..z)
1 <= Number of stars per cluster <= 160


输出


The output file contains the same map as the input file, except that the clusters are marked as described in Task.

There will generally be more than one way to label the clusters with letters. Your program should choose the labeling such that if the entire output file is read as a string, this string will be minimal in the lexicographical ordering.


样例输入

23
15
10001000000000010000000
01111100011111000101101
01000000010001000111111
00000000010101000101111
00000111010001000000000
00001001011111000000000
10000001000000000000000
00101000000111110010000
00001000000100010011111
00000001110101010100010
00000100110100010000000
00010001110111110000000
00100001110000000100000
00001000100001000100101
00000001110001000111000

样例输出

 

a000a0000000000b0000000
0aaaaa000ccccc000d0dd0d
0a0000000c000c000dddddd
000000000c0b0c000d0dddd
00000eee0c000c000000000
0000e00e0ccccc000000000
b000000e000000000000000
00b0f000000ccccc00a0000
0000f000000c000c00aaaaa
0000000ddd0c0b0c0a000a0
00000b00dd0c000c0000000
000g000ddd0ccccc0000000
00g0000ddd0000000e00000
0000b000d0000f000e00e0b
0000000ddd000f000eee000

提示


In this case, the sky map has width 23 and height 15. Just to make it clearer, notice that this input file corresponds to the following picture of the sky.

技术分享图片
Figure 2. Picture of the sky

This is one possible result for the sample input above. Notice that this output file corresponds to the following picture.

技术分享图片
Figure 3. Picture with the clusters marked

题意:有多个连通块,如果两个连通块 通过旋转90度,对称翻转后形状相同,则两个连通块归属为相同,按照行列的顺序用字符编号


技术分享图片技术分享图片

#include
using namespace std;
int w,h;
int up,l;
int bottom,r;
struct point{
int x,y;
};
char s[105][105],f[505];
bool vis[105][105];
vector
v[505],vk[505];
int dtx[]={-1,-1,-1,0,0,1,1,1};
int dty[]={0,1,-1,1,-1,1,0,-1};
bool check(int x,int y){
if(x<0||x>=h||y<0||y>=w)return false;
return true;
}
void bfs(int x,int y,int id){
queue
q;
l
=w;
up
=h;
q.push((point){x,y});
vis[x][y]
=1;
while(!q.empty()){
point u
=q.front();
v[id].push_back(u);
q.pop();
l
=min(l,u.y);
up
=min(up,u.x);
for(int i=0;i<8;i++){
point v
=u;
v.x
+=dtx[i];
v.y
+=dty[i];
if(!check(x,y))continue;
if(vis[v.x][v.y]==0&&s[v.x][v.y]==1){
q.push(v);
vis[v.x][v.y]
=1;
}
}
}
}
void get_vk(int id){
for(int i=0;i){
vk[id].push_back((point){v[id][i].x-up,v[id][i].y-l});
}
}
bool cmp(point a,point b){
return a.xb.y;
}
bool check_equal(vector a,vector b){
sort(a.begin(),a.end(),cmp);
sort(b.begin(),b.end(),cmp);
for(int i=0;i){
if(a[i].x!=b[i].x||a[i].y!=b[i].y)
return false;
}
return true;
}
void set_data(vector &a){//获得图形的边界
bottom=-1,r=-1;
for(int i=0;i){
bottom=max(a[i].x,bottom);
r
=max(a[i].y,r);
}
}
void Reverse(vector &a){ //左右翻转
set_data(a);
for(int i=0;i){
a[i].y=(r-a[i].y);
}
}
void spin(vector &a){//逆时针旋转
set_data(a);
for(int i=0;i){
int z=a[i].y;
a[i].y
=a[i].x;
a[i].x
=(r-z);
}
}
/*/char shape[105][105];
void out_shape(vector &a){
set_data(a);
for(int i=0;i<=bottom;i++)
for(int j=0;j<=r;j++)
shape[i][j]=‘0‘;
for(int i=0;i shape[a[i].x][a[i].y]=‘1‘;
}
printf("%d\n",a.size());
for(int i=0;i<=bottom;i++)
{for(int j=0;j<=r;j++)
printf("%c",shape[i][j]);
printf("\n");
}
printf("\n");
}/
*/
bool judge(int x,int y){//判断两个图形是否相似
vector vr,vt;
vr
=vk[x];vt=vk[y];
for(int i=1;i<=4;i++){
spin(vr);
//out_shape(vr);
if(check_equal(vr,vt))return true;
Reverse(vr);
//out_shape(vr);
if(check_equal(vr,vt))return true;
Reverse(vr);
//out_shape(vr);
}
return false;
}
int main(){
scanf(
"%d%d",&w,&h);
for(int i=0;i){
scanf("%s",s[i]);
}
int k=0;
for(int i=0;i){
for(int j=0;j){
if(s[i][j]==1&&vis[i][j]==0){
bfs(i,j,
++k);//bfs 查找连通块
get_vk(k); //图像左移上移
}
}
}
char ch=a;
f[
1]=a; //第一个连通块为a
for(int i=2;i<=k;i++){
int flag=0;
for(int j=1;j//和已判断连通块进行比较
if(vk[i].size()!=vk[j].size())continue;//点数不同直接跳过
if(judge(i,j)){ //图像相似
flag=1;
f[i]
=f[j];
break;
}
}
if(!flag)f[i]=++ch;//未有相似图像,新增图像字符
}
for(int i=1;i<=k;i++){
for(int j=0;j){
s[v[i][j].x][v[i][j].y]=f[i];
}
}
//字符设置
for(int i=0;i){
printf("%s\n",s[i]);
}
}


View Code

 





推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文详细探讨了BCTF竞赛中窃密木马题目的解题策略,重点分析了该题目在漏洞挖掘与利用方面的技巧。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • 回顾两年前春节期间的一个个人项目,该项目原本计划参加竞赛,但最终作为练习项目完成。独自完成了从编码到UI设计的全部工作,尽管代码量不大,但仍有一定的参考价值。本文将详细介绍该项目的背景、功能及技术实现。 ... [详细]
  • 在处理大数据量的SQL分页查询时,通常需要执行两次查询来分别获取数据和总记录数。本文介绍了一种优化方法,通过单次查询同时返回分页数据和总记录数,从而提高查询效率。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文将详细介绍如何在二进制和十六进制之间进行准确的转换,并提供实际的代码示例来帮助理解这一过程。 ... [详细]
  • empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!检测一个变量是否是null ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
  • 嵌套列表的扁平化处理
    本文介绍了一种方法,用于遍历嵌套列表中的每个元素。如果元素是整数,则将其添加到结果数组中;如果元素是一个列表,则递归地遍历这个列表。此方法特别适用于处理复杂数据结构中的嵌套列表。 ... [详细]
author-avatar
k3as0n_701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有