POJ 1693

题意:就是给你n条直线,求这n条直线最多可以构成多少个矩形。

思路:把直线分类,分成水平的和竖直的,然后两两组合,看是否能构成矩形。枚举

  1
  2 Memory: 692K		Time: 0MS
  3 Language: G++		Result: Accepted
  4 Source Code
  5 #include <string.h>
  6 #include <stdio.h>
  7 #include <iostream>
  8
  9 using namespace std;
 10
 11 int sx,sy,ex,ey;
 12
 13 struct c{
 14     int sx;
 15     int sy;
 16     int ex;
 17     int ey;
 18 }s[105],h[105];
 19
 20
 21 #define judge(x,y) h[y].sx<=s[x].ex&&h[y].ex>=s[x].ex&&s[x].sy<=h[y].ey&&s[x].ey>=h[y].ey
 22 // 目的是判断这两条直线是否有交点。
 23
 24
 25 int main()
 26 {
 27     int n,m,nums,ans,numh,tmp;
 28     scanf("%d",&n);
 29     while(n--)
 30     {
 31         scanf("%d",&m);
 32         nums=0,numh=0,ans=0;
 33         for(int i=0;i<m;i++)
 34         {
 35             scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
 36             if(sx==ex)
 37             {
 38                 if(sy>ey){tmp=sy;sy=ey;ey=tmp;}
 39                 s[nums].sx=sx;
 40                 s[nums].sy=sy;
 41                 s[nums].ex=ex;
 42                 s[nums].ey=ey;
 43                 nums++;
 44             }
 45             if(sy==ey)  //对直线进行分类,且这里要注意,直线的起点的坐标不一定要大于终点的坐标。
 46             {
 47                 if(sx>ex){tmp=sx;sx=ex;ex=tmp;}
 48                 h[numh].sx=sx;
 49                 h[numh].sy=sy;
 50                 h[numh].ex=ex;
 51                 h[numh].ey=ey;
 52                 numh++;
 53             }
 54         }
 55             for(int i=0;i<nums;i++)    //每两条直线来比较
 56                 for(int j=0;j<numh;j++)
 57                     if(judge(i,j))
 58                         for(int k=i+1;k<nums;k++)
 59                             if(judge(k,j))
 60                                 for(int l=j+1;l<numh;l++)
 61                                    if(judge(i,l))
 62                                      if(judge(k,l))
 63                                             ans++;
 64             printf("%d\n",ans);
 65     }
 66     return 0;
 67 }
 68
 69
 70
 71
 72
 73 
时间: 2024-11-05 06:07:42

POJ 1693的相关文章

数长方形有多少个?POJ(1693)

题目链接:http://poj.org/problem?id=1693 解题报告: 随机选两根横的,再找一下与这两根横线相交的竖线有多少根,m,那么就有(m-1)*m/2个长方形. #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; const int maxn = 100; struct line { int

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348

poj题库分类

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea

POJ题目(转)

http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (

Poj 题目分类

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea

POJ题目分类(转)

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea

北大POJ题库使用指南

原文地址:北大POJ题库使用指南 北大ACM题分类主流算法: 1.搜索 //回溯 2.DP(动态规划)//记忆化搜索 3.贪心 4.图论 //最短路径.最小生成树.网络流 5.数论 //组合数学(排列组合).递推关系.质因数法 6.计算几何 //凸壳.同等安置矩形的并的面积与周长.凸包计算问题 8.模拟 9.数据结构 //并查集.堆.树形结构 10.博弈论 11.CD有正气法题目分类: 1. 排序 1423, 1694, 1723, 1727, 1763, 1788, 1828, 1838, 1

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&