评测方式:文本比较

题目描述

这是一个数三角的游戏。长度为1或SQRT(2)的小木棍放在一个网格上。如图所示,有水平的,垂直的或对角的。对角放置的木棍可以交叉。

avatar

将木棍随意地放在网格上得到的图案可能不含三角形,也可能含一个或多个三角形。如下图所示,

avatar

(a),(b),,(d)和(e)分别含有2,5,12,0,0个三角形。你的任务是写一个程序数出一个图案中的三角形个数。。cpp

输入格式
输入文件count.in包括N+1行:

先输入图案中木棍的个数N。下面输入这N根木棍的位置,用两个网格坐标表示,这两个坐标分别为木棍两端的位置。网格大小不超过10´10,因此网格左下和右上的坐标分别为(0,0)和(9,9)。

输出格式
输入文件count.out包括1行:

三角形的个数。

样例
样例输入
3
0 0 0 1
0 0 1 0
0 1 1 0
样例输出
1

题目分析

这道题有许多细节的地方,而主要方法是描述线段,然后枚举各个点,判断是否是三角形,因为有交叉的情况,我们可以把一个格子分成四个

易错点

1可能会有两条线交叉的情况
2.有三点共线的情况

具体思路(描述线段)

1.当这条线段是竖着的

if(y1>y2)
{
pd[x1][y2][x1][y2+1]=1;
pd[x1][y2+1][x1][y2]=1;
pd[x1][y2+1][x1][y1]=1;
pd[x1][y1][x1][y2+1]=1;
}
else
{
pd[x1][y1][x1][y1+1]=1;
pd[x1][y1+1][x1][y1]=1;
pd[x1][y1+1][x1][y2]=1;
pd[x1][y2][x1][y1+1]=1;
}

2当这条线段是横着的

if(x1<x2)
{
pd[x1][y1][x1+1][y1]=1;
pd[x1+1][y1][x1][y1]=1;
pd[x1+1][y1][x2][y1]=1;
pd[x2][y1][x1+1][y1]=1;
}
else
{
pd[x2][y1][x2+1][y1]=1;
pd[x2+1][y1][x2][y1]=1;
pd[x2+1][y1][x1][y1]=1;
pd[x1][y1][x2+1][y1]=1;
}

3.当这条线段是斜着的

if(x1+y1-x2-y2==4)
{
pd[x2+1][y2+1][x1][y1]=1;
pd[x1][y1][x2+1][y2+1]=1;
pd[x2+1][y2+1][x2][y2]=1;
pd[x2][y2][x2+1][y2+1]=1;
}
if(x2+y2-x1-y1==4)
{
pd[x1+1][y1+1][x2][y2]=1;
pd[x2][y2][x1+1][y1+1]=1;
pd[x1+1][y1+1][x1][y1]=1;
pd[x1][y1][x1+1][y1+1]=1;
}
if(x1+y1==x2+y2)
{
pd[x1][y1][(x1+x2)/2][(y1+y2)/2]=1;
pd[(x1+x2)/2][(y1+y2)/2][x1][y1]=1;
pd[x2][y2][(x1+x2)/2][(y1+y2)/2]=1;
pd[(x1+x2)/2][(y1+y2)/2][x2][y2]=1;
}
}

4.然后就是可以对三角形进行统计不果,因为重复所以要/6;

#include<cstdio>
int pd[55][55][55][55];
int n;
int ans;
int x1,x2,y1,y2;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1*=2;
y1*=2;
x2*=2;
y2*=2;
if(x1==x2)
{
if(y1>y2)
{
pd[x1][y2][x1][y2+1]=1;
pd[x1][y2+1][x1][y2]=1;
pd[x1][y2+1][x1][y1]=1;
pd[x1][y1][x1][y2+1]=1;
}
else
{
pd[x1][y1][x1][y1+1]=1;
pd[x1][y1+1][x1][y1]=1;
pd[x1][y1+1][x1][y2]=1;
pd[x1][y2][x1][y1+1]=1;
}
}
if(y1==y2)
{
if(x1<x2)
{
pd[x1][y1][x1+1][y1]=1;
pd[x1+1][y1][x1][y1]=1;
pd[x1+1][y1][x2][y1]=1;
pd[x2][y1][x1+1][y1]=1;
}
else
{
pd[x2][y1][x2+1][y1]=1;
pd[x2+1][y1][x2][y1]=1;
pd[x2+1][y1][x1][y1]=1;
pd[x1][y1][x2+1][y1]=1;
}
}
if(x1+y1-x2-y2==4)
{
pd[x2+1][y2+1][x1][y1]=1;
pd[x1][y1][x2+1][y2+1]=1;
pd[x2+1][y2+1][x2][y2]=1;
pd[x2][y2][x2+1][y2+1]=1;
}
if(x2+y2-x1-y1==4)
{
pd[x1+1][y1+1][x2][y2]=1;
pd[x2][y2][x1+1][y1+1]=1;
pd[x1+1][y1+1][x1][y1]=1;
pd[x1][y1][x1+1][y1+1]=1;
}
if(x1+y1==x2+y2)
{
pd[x1][y1][(x1+x2)/2][(y1+y2)/2]=1;
pd[(x1+x2)/2][(y1+y2)/2][x1][y1]=1;
pd[x2][y2][(x1+x2)/2][(y1+y2)/2]=1;
pd[(x1+x2)/2][(y1+y2)/2][x2][y2]=1;
}
pd[x1][y1][x2][y2]=1;
pd[x2][y2][x1][y1]=1;
}
for (int i = 0; i <= 18; i++) {
for (int j = 0; j <= 18; j++) {
for (int z = 0; z <= 18; z++) {
for (int i1 = 0; i1 <= 18; i1++) {
for (int j1 = 0; j1 <= 18; j1++) {
for (int z1 = 0; z1 <= 18; z1++) {
if (pd[i][i1][j][j1] == 1 && pd[i][i1][z][z1] == 1 && !(i == j && i1 == j1) && !(i == z && i1 == z1) && (z1 - i1) * (j - i) - (j1 - i1) * (z - i) == 0 && pd[j][j1][z][z1] == 0 &&
pd[z][z1][j][j1] == 0) {
pd[j][j1][z][z1] = 1;
pd[z][z1][j][j1] = 1;
}
}
}
}
}
}
}
for(int i=0;i<=18;i++)
{
for(int j=0;j<=18;j++)
{
for(int k=0;k<=18;k++)
{
for(int i1=0;i1<=18;i1++)
{
for(int j1=0;j1<=18;j1++)
{
for(int k1=0;k1<=18;k1++)
{
if(pd[i][i1][j][j1]&&pd[j][j1][k][k1]&&pd[i][i1][k][k1]&&!(i1==j1&&i==j)&&!(i==k&&i1==k1)&&!(k==j&&k1==j1)&&((k1 - i1) * (j - i) - (j1 - i1) * (k - i) != 0))
{
ans++;
}
}
}
}
}
}
}
printf("%d",ans/6);
}

数三角count(归类)的更多相关文章

  1. hibernate 数据行数统计 count(*)

    Hibernate关于sql中的count(*)数据统计: ①如果使用的是HQL: 直接在HQL中使用count(*)即可获取行数 Long count = (Long)HibernateUtil.g ...

  2. (转载)MySQL 统计数据行数 Select Count

    (转载)http://www.5idev.com/p-php_mysql_select_count.shtml 统计数据行数 SELECT COUNT() FROM 语法用于从数据表中统计数据行数. ...

  3. MySQL 统计行数的 count

    MySQL count() 函数我们并不陌生,用来统计每张表的函数.但如果你的表越来越大,并且是 InnoDB 引擎的话,会发现计算的速度会越来越慢.在这篇文章里,会先介绍 count() 实现的原理 ...

  4. sql-函数avg,count,max,min,sum

     常用函数 AVG (平均) COUNT (计数) MAX (最大值) MIN (最小值) SUM (总合) 运用函数的语法是: SELECT "函数名"("栏位名&qu ...

  5. MySql中对Group by后的结果数进行Count

    今天在写MySQ的SQL语句的时候遇到了一个奇怪的问题 select count(*) from subsitealbum t1, photo t2,files t3 where t1.SourceA ...

  6. oracle count 百万级 分页查询记要总数、总条数优化

    oracle count 百万级 分页查询记录总数.总条数优化 oracle count 百万级 查询记录总数.总条数优化 最近做一个项目时,做分页时,发现分页查询速度很慢,分页我做的是两次查询,一次 ...

  7. 剑指Offer面试题:29.丑数

    一.题目:丑数 题目:我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个 ...

  8. group by 查询分组后 组的条数

    比如select gid from table group by gid 查询时使用下面的方法查询条数 select count(distinct gid) from table 使用select c ...

  9. entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等

    前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...

随机推荐

  1. ligerUI 关闭父弹窗JS报错问题 解决方法

    1:调用父窗口某一个文件框,获取焦点, parent.window.document.getElementById("roleName").focus(); 2:关闭父窗口pare ...

  2. java web 限制同一个用户在不同处登入

    用到的技术:map集合,sessionListener监听器,Fiter过滤器. 实现思路: 一.利用一个全局的map集合来保存每个用户sessionID的值的一个集合.一个用户对应一个session ...

  3. 【Linux】【Services】【SaaS】Docker+kubernetes(9. 安装consul实现服务注册发现)

    1. 简介 1.1. 官方网站: https://www.consul.io 1.2. Consul的功能: 服务发现:通过DNS或HTTP接口使得消费者发现服务,应用程序可以轻松找到所依赖的服务. ...

  4. C#内建接口:IEnumerable

    这节讲一下接口IEnumerable. 01 什么是Enumerable 在一些返回集合数据的接口中,我们经常能看到IEnumerable接口的身影.那什么是Enumerable呢?首先它跟C#中的e ...

  5. 手把手教你提交Jar包到Maven公共仓库 | 萌新写开源02

    在上一篇文章中,我介绍了自己的SpringBoot Starter项目,可以让我们使用注解的方式轻松地获取操作日志,并推送到指定数据源. 之前,我的项目开源在Github上,大家想要用我的项目,还得把 ...

  6. NSData NSDate NSString NSArray NSDictionary 相互转化

    //    NSData  NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; ...

  7. Golang爬虫+正则表达式

    最近学习go,爬取网站数据用到正则表达式,做个总结: Go中正则表达式采用RE2语法(具体是啥咱也不清楚): 字符 . --匹配任意字符 e.g: abc. 结果: abcd,abcx,abc9; [ ...

  8. JAVA接收postman的中raw的参数

    /** * java获取raw */ public static String readRaw(InputStream inputStream) { String result = "&qu ...

  9. c++指针函数和函数指针概述

    欢迎指正 代码写的不够规范: 目的是缩短文章篇幅,实际中请注意 阅读完本文, 你一定能判断和写出:指针函数和函数指针. 0.结论 A.指针函数: 函数的返回值是指针类型 B.函数指针: 函数名是一个指 ...

  10. 网络编程之UDP中一个包的大小最大能多大

    读书笔记:here 结论1:局域网环境下,建议将UDP数据控制在1472字节以下 一定要知道 因为链路层的传输单元(MTU)是1500字节,1500字节中并不包含链路层的首尾18个字节.1500字节是 ...