HDU 3659 Identify the number(数字识别 模拟)

2024-02-19 20:32

本文主要是介绍HDU 3659 Identify the number(数字识别 模拟),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3659

这个题目刚开以为是计算几何,其实是个毛线啊,就是一模拟题,不过这个题想AC还是需要花点时间想的,其实也比较简单,关键是细心

题意:给定你n条线段,每条线段长度为1,这么多线段会组合成数字(见题目图),每个数字之间的间隔5以上,让你从左到右输出数字

解题思路:

首先肯定是按照线段较小的x排序了,排序完成之后开始分组,每一组肯定是一个数字,然后判断这个数字是什么

首先当这个组的线段个数为2 3 4 7的时候可以直接得出表示的数字是什么,因为这几个数量唯一确定一个数字

然后就是6,可能的结果是0和6,这个好办,只要判断存在某点与另外所有点都不相交就确定是6,否则0

最后是5,这个题目核心就在5这里,2 3 5,到底是哪个,3的话好判断,只要存在一个点与另外两点有相交一定是3

最恶心的是2 和 5的判断,奶奶的镜面对称,想一会其实还是可以判断的

首先找出只有一个顶点和另外顶点相交的两条线段,同时记录是a端有相交还是b端有相交(a端指的是线段x值较小的一端,x相同y较小的)

然后找出两条线段相对位置低的那条,这时候要求的是低的那条一定是a端相交才是2,否则是5,如果是睡着的2,那么判断右边那条一定要是

a端相交!

(开始搞错直接判断右边的导致wa数次)

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
using namespace std;
#define maxn 15000
struct point{double x,y;bool operator == (const point &a) const{return a.x==x && a.y==y;}
}temp;
struct line{point a,b;
}po[maxn];
int n;
bool cmp(const line &a,const line &b){return a.a.x < b.a.x;
}
int function6(int l,int r){int i,k,j;for(i=l;i<=r;i++){for(j=l;j<=r;j++){if(i==j) continue;if(po[i].a==po[j].a || po[i].a==po[j].b) break;}if(j==r+1){ printf("6");return 0;}for(j=l;j<=r;j++){if(i==j) continue;if(po[i].b==po[j].a || po[i].b==po[j].b) break;}if(j==r+1){ printf("6");return 0;}}printf("0");return 0;
}
int function5(int l,int r){int i,j,k,count,t;line rec[10],tem;bool flag[10];memset(flag,false,sizeof(flag));t=0;for(i=l;i<=r;i++){count=0;for(j=l;j<=r;j++){if(i==j)continue;if(po[i].a==po[j].a || po[i].a==po[j].b)count++;}if(count==0){ rec[t]=po[i];flag[t++]=false;}//flag的意思是表示a这端相交没,false表示没相交if(count>=2){ printf("3"); return 0;}count=0;for(j=l;j<=r;j++){if(i==j)continue;if(po[i].b==po[j].a || po[i].b==po[j].b)count++;}if(count>=2){ printf("3"); return 0;}if(count==0){ rec[t]=po[i];flag[t++]=true;}}if(MIN(rec[0].a.y,rec[0].b.y) < MIN(rec[1].a.y,rec[1].b.y)){if(flag[0]){printf("2");return 0;}else {printf("5");return 0;}}else if(MIN(rec[0].a.y,rec[0].b.y) == MIN(rec[1].a.y,rec[1].b.y)){if(rec[0].a.x > rec[1].b.x){if(flag[0]){printf("2");return 0;}else {printf("5");return 0;}}else {if(flag[1]){printf("2");return 0;}else {printf("5");return 0;}}}else{if(flag[1]){printf("2");return 0;}else {printf("5");return 0;}}return 0;
}
int main(){int i,j,k,l,r;double Max;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++){scanf("%lf%lf%lf%lf",&po[i].a.x,&po[i].a.y,&po[i].b.x,&po[i].b.y);if(po[i].a.x > po[i].b.x)temp=po[i].a,po[i].a=po[i].b,po[i].b=temp;else if(po[i].a.x == po[i].b.x && po[i].a.y > po[i].b.y)temp=po[i].a,po[i].a=po[i].b,po[i].b=temp;}sort(po,po+n,cmp);l=0,r=0;Max=po[0].b.x;for(i=1;i<n;i++){if(po[i].a.x-Max > 5.0 || i==n-1){if(i!=n-1)r=i-1;elser=i;switch(r-l+1){case 2:printf("1");break;case 4:printf("4");break;case 3:printf("7");break;case 7:printf("8");break;case 6:function6(l,r);break;case 5:function5(l,r);break;default:while(1);}l=i;Max=po[i].b.x;}Max=MAX(Max,po[i].b.x);}printf("\n");}return 0;
}


这篇关于HDU 3659 Identify the number(数字识别 模拟)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/725871

相关文章

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :