1074: [SCOI2007]折纸origami

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 372  Solved: 229
[Submit][Status][Discuss]

Description

  桌上有一张边界平行于坐标轴的正方形纸片,左下角的坐标为(0,0),右上角的坐标为(100,100)。接下来执行
n条折纸命令。每条命令用两个不同点P1(x1,y1)和P2(x2,y2)来表示,执行时把当前的折纸作品沿着P1P2所在直线
折叠,并把有向线段P1P2的右边折向左边(左边的部分保持不变)。折叠结束后,需要在作品上打一个孔,然后用
绳子穿起来挂在墙上。孔的位置是相当重要的:若需要穿过太多层的纸,打孔本身比较困难;若穿过的层数太少,
悬挂起来以后作品可能会被撕破。为了选择一个比较合适的打孔位置,你需要计算在每个候选位置打孔时穿过的层
数。如果恰好穿过某一层的边界(误差0.000001内),则该层不统计在结果中。本题考虑一个简化的模型:纸的厚
度不计,因此折纸操作总能完美执行。

Input

  输入第一行为一个整数n,即折纸的次数。以下n行每行四个实数x1,y1,x2,y2,表示每次折纸时对应的有向线
段。下一行包含一个正整数m,即候选位置的个数,以下每行包含两个实数x,y,表示一个候选位置。0<=n<=8, 1<=
m<=50

Output

  每个候选位置输出一行,包含一个整数,即该位置打孔时穿过的层数。

Sample Input

2
-0.5 -0.5 1 1
1 75 0 75
6
10 60
80 60
30 40
10 10
50 50
20 50

Sample Output

4
2
2
0
0
2

怒怼了几天计算几何,先挖坑

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 const double eps=1e-6;
 8
 9 struct Point
10 {
11     double x,y;
12 }P[100000];
13 int n,m;
14 double X1[10],Y1[10],X2[10],Y2[10];
15
16 bool cmp(Point A,Point B)
17 {
18     return (A.x==B.x)?A.y<B.y:A.x<B.x;
19 }
20
21 Point flex(double x,double y,int k)
22 {
23     double A,B,C,Z,X,Y;
24     A=Y1[k]-Y2[k];
25     B=X2[k]-X1[k];
26     C=Y2[k]*(X1[k]-X2[k])-X2[k]*(Y1[k]-Y2[k]);
27     Z=(A*x+B*y+C)/(A*A+B*B);
28     X=x-2*A*Z;
29     Y=y-2*B*Z;
30     return (Point){X,Y};
31 }
32
33 int query(double x,double y)
34 {
35     int now,top=0;
36     P[++top]=(Point){x,y};
37     for(int i=n;i>=1;i--)
38     {
39         now=top;
40         for(int j=1;j<=now;j++)
41             P[++top]=flex(P[j].x,P[j].y,i);
42     }
43     now=0;
44     sort(P+1,P+top+1,cmp);
45     for(int i=1;i<=top;i++)
46         if(P[i].x!=P[i-1].x||P[i].y!=P[i-1].y)
47             P[++now]=P[i];
48     return now;
49 }
50
51 int main()
52 {
53     scanf("%d",&n);
54     for(int i=1;i<=n;i++)
55     {
56         scanf("%lf%lf%lf%lf",&X1[i],&Y1[i],&X2[i],&Y2[i]);
57     }
58     scanf("%d",&m);
59     for(int i=1;i<=m;i++)
60     {
61         double x,y;
62         scanf("%lf%lf",&x,&y);
63         printf("%d\n",query(x,y));
64     }
65     return 0;
66 }

原文地址:https://www.cnblogs.com/InWILL/p/9513768.html

时间: 2024-07-29 12:29:26

1074: [SCOI2007]折纸origami的相关文章

【BZOJ】1074: [SCOI2007]折纸origami

http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n次(n<=8,右边折向左边),折完后,有m个询问(m<=50),每次询问一个点在最终的图形中穿过了几次纸片. #include <cstdio> #include <cstring> #include <cmath> #include <string>

BZOJ1074 [SCOI2007]折纸origami

我们先看每个点可能从哪些点折过来的,2^10枚举对角线是否用到. 然后再模拟折法,查看每个点是否满足要求. 恩,计算几何比较恶心,还好前几天刚写过一道更恶心的计算几何,点类直接拷过来2333. 1 /************************************************************** 2 Problem: 1074 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:24 ms 7 Memory

P4468 [SCOI2007]折纸

题意 似乎边界上(折线上.正方形纸片边上)的点认为是\(0\). 由于操作次数很少,因此逆着操作,求出所有可能的点,之后正向模拟一遍判断即可. 求一个点关于一个向量的对称点:用向量旋转求出方向向量即可. code: #include<bits/stdc++.h> using namespace std; const int maxn=10; const double eps=1e-8; const double Pi=acos(-1.0); const double inf=1e9; int

CSS3写折纸

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>折纸选项卡</title> <style> @-webkit-keyframes open { 0% { -webkit-transform:rotateX(-120deg);

关于折纸的动画

其实关于折纸的重点是在HTML和CSS的布局上主要就是要一个嵌套一个,如果不是的话,会有撑开的宽高从而难以连接在一起.不过折纸还没有写完一些兼容,也是参考视频上作的小练习 <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题</title></head><bo

折纸问题java实现

1 /** 2 * 折纸问题 这段代码写的太low了 本人水平有限 哎... 全是字符串了 3 * @param n 4 * @return 5 * @date 2016-10-7 6 * @author shaobn 7 */ 8 public static String[] flodpaper(int n){ 9 int length = (int)Math.pow(2,n)-1; 10 int position = (int)Math.pow(2,n-1)-1; 11 String[] s

例题1折纸痕

递归算法的思路,使用 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace 例题1折纸痕 {     

UVA 177 PaperFolding 折纸痕

著名的折纸问题:给你一张很大的纸,对折以后再对折,再对折……每次对折都是从右往左折,因此在折了很多次以后,原先的大纸会变成一个窄窄的纸条.现在把这个纸条沿着折纸的痕迹打开,每次都只打开“一半”,即把每个痕迹做成一个直角,那么从纸的一端沿着和纸面平行的方向看过去,会看到一条美妙的曲线. 就是一个分形,规定一下,纸的朝向,然后不难发现规律.图形输出方面,存下x和y坐标,然后下标排个序,或者用map. 为什么感觉模拟好难写啊... //Rey 2015.8.3 #include<bits/stdc++

[FZYZOJ 2162] Zrn神犇之折纸游戏

P2162 -- Zrn神犇之折纸游戏 时间限制:2000MS 内存限制:524288KB Description Zrn神犇最近喜欢上一款折纸游戏,因此他几乎每天都拿着一条悠长悠长又寂寥的纸带折来折去.其具体规则是这样的: 这是一个长度为N,宽度为1的纸条,从1开始写着连续的N个自然数. 1 2 3 4 5 6 … N 如果它的长度为偶数,Zrn神犇则会很高兴,直接把它从左往右或从右往左对折.比如长度为6的纸条从左往右对折完就会是这样: 如果它的长度为质数,Zrn神犇则会觉得不太爽,他就只能把