nyoj298_点的变换_错误

点的变换

时间限制:2000 ms  |  内存限制:65535 KB

难度:5

描述

平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作:

平移一定距离(M),相对X轴上下翻转(X),相对Y轴左右翻转(Y),坐标缩小或放大一定的倍数(S),所有点对坐标原点逆时针旋转一定角度(R)。

操作的次数不超过1000000次,求最终所有点的坐标。

提示:如果程序中用到PI的值,可以用acos(-1.0)获得。

输入
只有一组测试数据
测试数据的第一行是两个整数N,M,分别表示点的个数与操作的个数(N<=10000,M<=1000000)
随后的一行有N对数对,每个数对的第一个数表示一个点的x坐标,第二个数表示y坐标,这些点初始坐标大小绝对值不超过100。
随后的M行,每行代表一种操作,行首是一个字符:
首字符如果是M,则表示平移操作,该行后面将跟两个数x,y,表示把所有点按向量(x,y)平移;
首字符如果是X,则表示把所有点相对于X轴进行上下翻转;
首字符如果是Y,则表示把所有点相对于Y轴进行左右翻转;
首字符如果是S,则随后将跟一个数P,表示坐标放大P倍;
首字符如果是R,则随后将跟一个数A,表示所有点相对坐标原点逆时针旋转一定的角度A(单位是度)
输出
每行输出两个数,表示一个点的坐标(对结果四舍五入到小数点后1位,输出一位小数位)
点的输出顺序应与输入顺序保持一致
样例输入
2 5
1.0 2.0 2.0 3.0
X
Y
M 2.0 3.0
S 2.0
R 180
样例输出
-2.0 -2.0
0.0 0.0
#include <iostream>
#include <cstdio>
#include <cmath>

#define PI acos(-1.0)

using namespace std;

struct Point{
    double m[3][1];
};

struct matrix2{
    double m[3][3];
};

Point point[10005];//点的坐标
matrix2 opera[5];//五种操作的对应矩阵
matrix2 ans;

void init(matrix2 &t){
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            t.m[i][j]=0;
        }
    }
    for(int i=0;i<3;i++){
        t.m[i][i]=1;
    }
}

matrix2 mult(matrix2 a,matrix2 b){//操作矩阵相乘
    matrix2 t;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            t.m[i][j]=0;
            for(int k=0;k<3;k++){
                t.m[i][j]+=a.m[i][k]*b.m[k][j];
            }
        }
    }
    return t;
}

Point mult2(matrix2 a,Point b){
    Point t;
    for(int i=0;i<3;i++){
        for(int j=0;j<1;j++){
            t.m[i][j]=0;
            for(int k=0;k<3;k++){
                t.m[i][j]+=a.m[i][k]*b.m[k][j];
            }
        }
    }
    return t;
}

void moper(double p,double q){
    ans.m[0][2]+=p;
    ans.m[1][2]+=q;
}

void soper(double p){
    matrix2 tmp;
    init(tmp);
    tmp.m[0][0]=p;
    tmp.m[1][1]=p;
    ans=mult(ans,tmp);
}

void xoper(){
    matrix2 tmp;
    init(tmp);
    tmp.m[1][1]=-1;
    an                        ;
}

void yoper(){
    matrix2 tmp;
    init(tmp);
    tmp.m[0][0]=-1;
    ans=mult(ans,tmp);
}

void roper(float pp){
    matrix2 tmp;
    init(tmp);
    double tt=pp/180.0*PI;

    float aaa=cos(tt);
    tmp.m[0][0]=aaa;

     aaa=-sin(tt);
    tmp.m[0][1]=aaa;

     aaa=sin(tt);
    tmp.m[1][0]=aaa;

     aaa=cos(tt);
    tmp.m[1][1]=aaa;

    ans=mult(ans,tmp);
}

int main()
{
    int N,M;

    double p=180;
    double t=p/180.0*PI;
    printf("%lf",sin(t));

    scanf("%d %d",&N,&M);
    for(int i=0;i<N;i++){
        scanf("%lf %lf",&point[i].m[0][0],&point[i].m[1][0]);
    }
    char o;
    double t1,t2;
    init(ans);
    for(int i=0;i<M;i++){
        getchar();
        scanf("%c",&o);
        if(o==‘X‘){
            xoper();
            continue;
        }
        if(o==‘Y‘){
            yoper();
            continue;
        }
        if(o==‘M‘){
            scanf("%lf %lf",&t1,&t2);
            moper(t1,t2);
            continue;
        }
        if(o==‘S‘){
            scanf("%lf",&t1);
            soper(t1);
            continue;
        }
        if(o==‘R‘){
            scanf("%lf",&t1);
            roper(t1);
            continue;
        }
    }

    for(int i=0;i<N;i++){
        Point tt;
        tt=mult2(ans,point[i]);
        printf("%.1lf %.1lf\n",tt.m[0][0],tt.m[1][0]);
    }
    return 0;
}
时间: 2024-10-04 16:15:46

nyoj298_点的变换_错误的相关文章

电信宽带_错误676_电话占线 解决办法

ADSL/光宽带_错误676_解决方法:1.关闭宽带猫:2.释放网卡地址(具体操作步骤:点击“开始”菜单→“运行”→输入:cmd→回车→在弹出的窗口中输入:ipconfig release →回车)3.打开宽带猫,等待猫灯状态正常后拨号.LAN宽带解决方法:1.释放网卡地址(具体操作步骤:点击“开始”菜单→“运行”→输入:cmd→回车→在弹出的窗口中输入:ipconfig release →回车).2.重新连接宽带连接.

VC++_错误 无法打开包括文件“glglut.h” No such file or directory 怎么办

在网上看到类似的问题,查找资料找到了解决方案,现整理如下,有些更改,好让自己多些印象,附原文网址:http://blog.csdn.net/bigloomy/article/details/6226530 本人使用的是vs2012,编写一个简单的opengl程序,运行的时候总是提示: fatal error C1083: 无法打开包括文件:"GL/glut.h": No such file or directory 这个时候就要进行相应的如下操作: 1.下载GLUT工具包,参考网址:h

C零散_清空缓冲区_错误检测_数字转字符串

1 fflush(stdin) 清空输入缓存区,对于输入类型错误相当有用. 例: 1 int res, i; 2 while ( fflush(stdin), ( res = scanf("%d", i) ) != EOF ) 3 { 4 } 输入之前将输入缓存区清空,所以当将i错输入成字符时,只会影响当次结果,而不会影响下次正确输入的结果. 错误检测函数: 宏定义: 可将val(数字)转化为字符串 1 #define STR(val) #val

PHP常用功能块_错误和异常处理 — php(32)

一.错误和异常处理 1.1 错误类型和基本的调试方法PHP程序的错误发生一般归属于下列三个领域: 语法错误:语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行时错误:这种错误一般不会阻止PHP脚本的执行,但会阻止当前要做的事情.输出一条错误,但php脚本继续执行 逻辑错误:这种错误最麻烦,既不阻止脚本执行,也不输出错误消息.一个异常则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行. PHP的错误报告级别

[bzoj1692][Usaco2007 Dec]队列变换_后缀数组_贪心

队列变换 bzoj-1692 Usaco-2007 Dec 题目大意:给定一个长度为$n$的字符串.每次从头或尾取出一个字符加到另一个字符串里.要求变换后生成的字符串字典序最小,求字典序最小的字符串. 注释:$1\le n\le 3\cdot 10^4$. 想法: 考虑暴力怎么做: 每次把当前字符串左右较小的取出来.如果一样就对着往中间枚举,直到不一样为止. 这样时间复杂度为$O(n^2)$,全是一样的字符即可卡掉. 显然上述过程我们就是比较正反两个字符串谁的字典序更小对吧. 那么我们把原串翻转

序列操作

2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川  题目等级 : 大师 Master 题目描述 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0 3

python就业班-淘宝-目录.txt

卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述.flv│ │ 02-IP地址.flv│ │ 03-Linux.windows查看网卡信息.flv│ │ 04-ip地址的分类-ipv4和ipv6介绍.flv│ │ 05-(重点)端口.mp4│ │ 06-端口分类:知名端口.动态端口.flv│ │ 07-socket介绍.mp4│ │ │ ├─02

(五)分数阶微分方程的解法及其适定性问题介绍

a ) 为此介绍一些常见的变换及其性质Laplace变换的定义为$$ \mathscr{L} \{f(t)\}=\int_{0}^{\infty}f(t)e^{-st}dt$$Laplace反演变换公式为$$\mathscr{L}^{-1}F(s)=\int_{0}^{\infty}F(s)e^{st}ds $$定义卷积$$f(t)\ast g(t)=\int_{0}^{t}f(t-\tau)g(\tau)d\tau=\int_{0}^{t}f(t)g(t-\tau)d\tau=g(t) \as

RequireJS 2.0 正式发布(转)

RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0.随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升级到了2.0.1.此次变化较大,代码也进行了重构,层次更清晰可读.功能上主要变化如下: 1,延迟模块的执行. 这是一个很大变化,以前模块加载后factory立马执行.性能上肯定有一些损耗.2.0修改实现,再没人诟病AMD的模块是立即执行的.现在也可以等到require的时候才执行. 2,config增加了shi