http://acm.nyist.net/JudgeOnline/problem.php?pid=298

最好还是自己手推一下矩阵式子..不算太难..但是有一些小知识....

首先当然是矩阵的细节..矩阵是不支持交换率的..所以如图的式子乘进去时要放在左边...

还有的比如说:

cmath里的sin函数用的是弧度制..需要把度数/180*M_PI ( M_PI是cmath里定义的常数π );

double在取固定小数位的时候小负数四舍五入会出现-0.0之类的情况,可以自己const一个小数eps加上去.

代码如下

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
const double eps=1e-;
int n,m;
double a[maxn][]={};
double b[][]={};//初始
double c[][]={};//添加
double e[][]={};//结束
void doit(int k){
if(k==){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
b[i][j]=c[i][j];
}
}
}else{
memset(e,,sizeof(e));
for(int i=;i<=;i++){
for(int j=;j<=;j++){
for(int w=;w<=;w++){
e[i][j]+=c[i][w]*b[w][j];
}
}
}
for(int i=;i<=;i++){
for(int j=;j<=;j++){
b[i][j]=e[i][j];
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%lf%lf",&a[i][],&a[i][]);
}double x,y;
for(int i=;i<=m;++i){
memset(c,,sizeof(c));
char ch;
scanf("%s",&ch);
if(ch=='M'){
scanf("%lf%lf",&x,&y);
c[][]=1.0;c[][]=1.0;
c[][]=1.0;c[][]=x;c[][]=y;
}else if(ch=='X'){
c[][]=1.0;c[][]=-1.0;c[][]=1.0;
}else if(ch=='Y'){
c[][]=-1.0;c[][]=1.0;c[][]=1.0;
}else if(ch=='S'){
scanf("%lf",&x);
c[][]=x;c[][]=x;c[][]=1.0;
}else{
scanf("%lf",&x);
c[][]=cos(x/*M_PI);c[][]=-sin(x/*M_PI);
c[][]=sin(x/*M_PI);c[][]=cos(x/*M_PI);
c[][]=1.0;
}
doit(i);
}
for(int i=;i<=n;i++){
x=a[i][]*b[][]+a[i][]*b[][]+*b[][];
y=a[i][]*b[][]+a[i][]*b[][]+*b[][];
printf("%.1f %.1f\n",x+eps,y+eps);
}
return ;
}

NYOJ 298 点的变换 矩阵乘法的更多相关文章

  1. NYOJ 298 点的变换

    题目链接:298 点的变换 这题放在矩阵快速幂里,我一开始想不透它是怎么和矩阵搭上边的,然后写了个暴力的果然超时,上网看了题解后,发现竟然能够构造一些精巧的矩阵来处理,不得不说实在太强大了! http ...

  2. OpenGL学习进程(12)第九课:矩阵乘法实现3D变换

    本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈.     (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ...

  3. CNN卷积神经网络_深度残差网络 ResNet——解决神经网络过深反而引起误差增加的根本问题,Highway NetWork 则允许保留一定比例的原始输入 x。(这种思想在inception模型也有,例如卷积是concat并行,而不是串行)这样前面一层的信息,有一定比例可以不经过矩阵乘法和非线性变换,直接传输到下一层,仿佛一条信息高速公路,因此得名Highway Network

    from:https://blog.csdn.net/diamonjoy_zone/article/details/70904212 环境:Win8.1 TensorFlow1.0.1 软件:Anac ...

  4. NYOJ298 点的变换 【矩阵乘法经典】

    任意门:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=298 点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 ...

  5. NYOJ 298

    利用矩阵来做变换,参考Max大神的思想的,虽然不是同一道题. ----------- 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转    这里的操 ...

  6. 有关CUBLAS中的矩阵乘法函数

    关于cuBLAS库中矩阵乘法相关的函数及其输入输出进行详细讨论. ▶ 涨姿势: ● cuBLAS中能用于运算矩阵乘法的函数有4个,分别是 cublasSgemm(单精度实数).cublasDgemm( ...

  7. 使用blas做矩阵乘法

      #define min(x,y) (((x) < (y)) ? (x) : (y)) #include <stdio.h> #include <stdlib.h> # ...

  8. 矩阵乘法code

    VOJ1067 我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0.例如 ...

  9. luogu P4719 【模板】动态 DP 矩阵乘法 + LCT

    方法二:LCT+矩阵乘法 上文中,我们用线段树来维护重链上的各种矩阵转移. 第二种方法是将树链剖分替换为动态树. 我们知道,矩阵乘法 $\begin{bmatrix} F_{u,0} & F_ ...

随机推荐

  1. MySql 快速去重方法

    1.复制需要去重的表 CREATE TABLE 新表 LIKE 旧表 ; 2.将需要去重的字段 设置为唯一union 索引 ALTER TABLE 表名 ADD UNIQUE(`字段`); 3.复制旧 ...

  2. VC进度条的使用

    m_progress->GetPos(); //获取进度条的当前位置 m_progress->GetRange(int min,int max); //获取进度条控件的范围的下限和上限 m ...

  3. python3爬虫.2.伪装浏览器

    有的网页在爬取时候会报错返回 urllib.error.HTTPError: HTTP Error 403: Forbidden 这是网址在检测连接对象,所以需要伪装浏览器,设置User Agent ...

  4. python3学习笔记.2.基础

    1.编码 默认编码是 utf-8 # -*- coding: utf-8 -*- 2.注释 单行注释  # 多行注释,用三个单引号或双引号 3.关键字 可在交互窗口查询. >>> i ...

  5. discuz2.5登录后台闪退的解决办法

    今天突然发现discuz2.5论坛后台进不去,开始以为密码错了,但发现登录后也是闪退.我试着清除浏览器cookie,也换了其他浏览器也没有用,还是上网找找吧! discuz2.5进入后台闪退的原因: ...

  6. KS(Kolmogorov-Smirnov)(转)

    来源:https://blog.csdn.net/u013421629/article/details/78217498 KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估 ...

  7. 生成器(generator)和迭代(iterable , iterator, iteration)

    在搞清楚Generator之前,我们先讨论一下 iterable , iterator, iteration 1.Iterable 我们知道,在Python中所有东西都是object, 比如说变量,容 ...

  8. 理解一条语句:SELECT difference(sum("value")) FROM "mq_enqueue" WHERE "channel" =~ /ActiveMQ_TEST/ AND $timeFilter GROUP BY time($interval)

    最近使用grafana在查询InfluxDB中,用到了这一条语句 SELECT difference(sum("value")) FROM "mq_enqueue&quo ...

  9. 窗口生效函数UpdateData

    Invalidate()使整个窗口客户区无效.窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘.这时Windows会在应用程序 ...

  10. leetcode 之trap water(8)

    这题不太好想.可以先扫描找到最高的柱子,然后分别处理两边:记录下当前的局部最高点,如果当前点小于局部最高点,加上, 反则,替换当前点为局部最高点. int trapWater(int A[], int ...