接着上篇的例题。

1.洛谷P4924魔法少女小Scarlet

题目描述:

Scarlet最近学会了一个数组魔法,她会在n∗n二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转90°,

首先,Scarlet会把1到n^2的正整数按照从左往右,从上至下的顺序填入初始的二维数组中,然后她会施放一些简易的魔法。

Scarlet既不会什么分块特技,也不会什么Splay套Splay,她现在提供给你她的魔法执行顺序,想让你来告诉她魔法按次执行完毕后的二维数组。

输入格式

第一行两个整数n,m,表示方阵大小和魔法施放次数。

接下来m行,每行4个整数x,y,r,z,表示在这次魔法中,Scarlet会把以第x行第y列为中心的2r+1阶矩阵按照某种时针方向旋转,其中z=0表示顺时针,z=1表示逆时针。

输出格式

输出n行,每行n个用空格隔开的数,表示最终所得的矩阵

输入1:
5 4
2 2 1 0
3 3 1 1
4 4 1 0
3 3 2 1
输出1:
5 10 3 18 15
4 19 8 17 20
1 14 23 24 25
6 9 2 7 22
11 12 13 16 21

解析:

解题的关键在理清矩阵变换之前和之后的关系,例如顺时针旋转3*3的矩阵90度,就是把矩阵的第一列变换为第一行,第二列变为第二行,第三列变为第一行。对于大小为2r+1的矩阵来说,r就是矩阵的半径。具体说明附在下方代码。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int tmp[600][600],re[600][600];
int n,m,tot=0;
//顺时针转
void spin0(int x,int y,int r)//坐标x,y,以及半径r
{for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)tmp[i][j]=re[i][j];//tmp记载原矩阵//开始行列变换int x1=x+r,y1=y-r;for(int i=x-r;i<=x+r;i++){for(int j=y-r;j<=y+r;j++){re[i][j]=tmp[x1][y1];x1--;}x1=x+r;y1++;}
}
//逆时针转同理
void spin1(int x,int y,int r)
{for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)tmp[i][j]=re[i][j];int x1=x-r,y1=y+r;for(int i=x-r;i<=x+r;i++){for(int j=y-r;j<=y+r;j++){re[i][j]=tmp[x1][y1];x1++;}x1=x-r;y1--;}
}
int main()
{int x,y,r,z;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)re[i][j]=++tot;//初始化矩阵while(m--)//执行每次操作{scanf("%d%d%d%d",&x,&y,&r,&z);if(z==0)spin0(x,y,r);else spin1(x,y,r);}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(j==n)printf("%d\n",re[i][j]);else printf("%d ",re[i][j]);return 0;
}

2.洛谷P1328生活大爆炸版石头剪刀布

题目描述:

石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一 样,则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。

升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:

斯波克:《星际迷航》主角之一。

蜥蜴人:《星际迷航》中的反面角色。

这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。

现在,小 A和小 B尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的,但周期长度不一定相等。例如:如果小A以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为 6 的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克-…”,而如果小B以“剪刀-石头-布-斯波克-蜥蜴人”长度为 5 的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克-蜥蜴人-…”

已知小 A和小 B 一共进行 N 次猜拳。每一次赢的人得 1 分,输的得 0 分;平局两人都得 0 分。现请你统计 N 次猜拳结束之后两人的得分。

输入格式

第一行包含三个整数:N,NA​,NB​,分别表示共进行 N 次猜拳、小 A出拳的周期长度,小 B 出拳的周期长度。数与数之间以一个空格分隔。

第二行包含 NA​ 个整数,表示小 A出拳的规律,第三行包含 NB​ 个整数,表示小 B 出拳的规律。其中,0 表示“剪刀”,1 表示“石头”,2 表示“布”,3 表示“蜥蜴人”,4表示“斯波克”。数与数之间以一个空格分隔。

输出格式

输出一行,包含两个整数,以一个空格分隔,分别表示小 A、小 B的得分。

输入1:
10 5 6
0 1 2 3 4
0 3 4 2 1 0
输出1:
6 2

解析:

先将各个关系进行制表,再记录每局输赢情况。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,na,nb,cnta,cntb,a[210],b[210];
int vs[5][5]={{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}};
int main()
{scanf("%d%d%d",&n,&na,&nb);for(int i=0;i<na;i++)scanf("%d",&a[i]);for(int i=0;i<nb;i++)scanf("%d",&b[i]);for(int i=0;i<n;i++){cnta+=vs[a[i%na]][b[i%nb]];cntb+=vs[b[i%nb]][a[i%na]];}printf("%d %d\n",cnta,cntb);return 0;
}

3.洛谷P1518两只塔姆沃斯牛 The Tamworth Two

题目描述

两只牛逃跑到了森林里。Farmer John 开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和 John)。

追击在 10×10 的平面网格内进行。一个格子可以是:一个障碍物,两头牛(它们总在一起),或者 Farmer John。两头牛和 Farmer John 可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。

一个格子可以是:

. 空地;
* 障碍物;
C 两头牛;
F Farmer John。

牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍(地图边沿也是障碍),它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转 90 度。 同时,它们不会离开地图。

Farmer John 深知牛的移动方法,他也这么移动。

每次(每分钟)Farmer John 和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。

读入十行表示地图。每行都只包含 10 个字符,表示的含义和上面所说的相同。保证地图中只有一个 F 和一个 C。F 和 C 一开始不会处于同一个格子中。

计算 Farmer John 需要多少分钟来抓住他的牛,假设牛和 Farmer John 一开始的行动方向都是正北(即上)。 如果 John 和牛永远不会相遇,输出 0。

输入格式:

输入共十行,每行 10 个字符,表示如上文描述的地图。

输出格式

输出一个数字,表示 John 需要多少时间才能抓住牛们。如果 John 无法抓住牛,则输出 0。

输入输出见链接

解析:

本题的难点在于不知道什么情况下输出0,也就是进入无限循环,想清楚这点,这题不难。因为两者的移动方式事一样的,所以可能会出现永远都“抓”不到的情况,也就是两者都经过相同的一点,并且在这点时的方向相同。

那么要怎么判断两者经过同一点时且方向相同呢,这里需要一种标记tag=农民的x+农民的y10+奶牛的x100+奶牛的y1000+农民的方向10000+奶牛的方向*40000(方向只有4种可能);那么产生的tag的值是唯一的,只要判断tag是否产生两次就能判断是否陷入死循环。

AC代码:

#include<bits/stdc++.h>
using namespace std;
char mp[12][12];
int f[3],c[3];
int ans,tag;
int vis[170000];
void move(int x,int y,int z,int k)
{if(z==0){if(mp[x-1][y]=='*')if(k==0) f[0]=1;else c[0]=1;else if(k==0) f[1]--;else c[1]--;}else if(z==1){if(mp[x][y+1]=='*')if(k==0) f[0]=2;else c[0]=2;else if(k==0) f[2]++;else c[2]++;}else if(z==2){if(mp[x+1][y]=='*')if(k==0) f[0]=3;else c[0]=3;else if(k==0) f[1]++;else c[1]++;}else if(z==3){if(mp[x][y-1]=='*')if(k==0) f[0]=0;else c[0]=0;else if(k==0) f[2]--;else c[2]--;}
}
int main()
{for(int i=0;i<=11;i++)mp[i][0]='*',mp[0][i]='*',mp[11][i]='*',mp[i][11]='*';for(int i=1;i<=10;i++)for(int j=1;j<=10;j++){scanf(" %c",&mp[i][j]);if(mp[i][j]=='F') f[1]=i,f[2]=j;if(mp[i][j]=='C') c[1]=i,c[2]=j;}while(!(f[1]==c[1]&&f[2]==c[2])){tag=f[1]+f[2]*10+c[1]*100+c[2]*1000+f[0]*10000+c[0]*40000;if(vis[tag]){printf("0\n");return 0;}move(f[1],f[2],f[0],0);move(c[1],c[2],c[0],1);ans++;vis[tag]=1;}printf("%d\n",ans);return 0;
}

4.洛谷P1067多项式输出

题目描述:

给定最高次和系数,输出一元n次多项式。

格式:

1.多项式中自变量为x,从左到右按照次数递减顺序给出多项式。2.多项式中只包含系数不为0的项。3.如果多项式n次项系数为正,则多项式开头不出现“+”号,如果多项式n次项系数为负,则多项式以“-”号开头。
4.对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。
5.如果x的指数大于1,则接下来紧跟的指数部分的形式为“x^b”,其中 b为 x的指数;如果 x的指数为1,则接下来紧跟的指数部分形式为“x”;如果 x 的指数为0,则仅需输出系数即可。
6.多项式中,多项式的开头、结尾不含多余的空格。

输入1:

5
100 -1 1 -3 0 10

输出1:


AC代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{int n,a;scanf("%d",&n);for(int i=n;i>=0;i--){scanf("%d",&a);if(a){if(i!=n&&a>0)cout<<"+";if(a<0)cout<<"-";if(abs(a)>1||i==0)cout<<abs(a);if(i>1)cout<<"x^"<<i;if(i==1)cout<<"x";}}return 0;
}

洛谷算法题单:模拟与高精度例题(下)相关推荐

  1. 洛谷算法题单:模拟与高精度例题(上)

    一:模拟 想要利用计算机解决现实生活中的一些复杂的问题时,建立模型是解决问题的关键. 举个生活中常见的例子:我们拿到了某次数学考试的成绩单,现在需要知道谁考得最好.当然不能把成绩单对着电脑晃一晃,然后 ...

  2. python【洛谷算法题单-搜索】P1605 迷宫

    题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次只能移 ...

  3. 洛谷oj题单【入门2】分支结构-入门难度(Java)

    洛谷oj题单[入门2]分支结构-入门难度(Java) 来源:https://www.luogu.com.cn/training/101#problems P5709 [深基2.习6]Apples Pr ...

  4. 洛谷日常刷题(洛谷官方题单 思路+详解)

    目录 前言 非官方题单的题 P1141 01迷宫 1-4 递推与递归 P1255 数楼梯 1002 [ NOIP 2002 普及组]过河卒 P1044 [NOIP2003 普及组] 栈 P1028 [ ...

  5. 洛谷-官方题单版【入门篇】

    文章目录 [入门1]顺序结构 P1000 超级玛丽游戏 *P5704 [深基2.例6]字母转换 P5705 [深基2.例7]数字反转 P1425 小鱼的游泳时间 P1421 小玉买文具 P3954 [ ...

  6. 洛谷入门题单 --【入门1】顺序结构 题解

    - [P1001 A+B Problem] - [P1000 超级玛丽游戏] - [P5703 [深基2.例5]苹果采购] - [P5704 [深基2.例6]字母转换] - [P5705 [深基2.例 ...

  7. 【OJ】洛谷字符串题单题解锦集

    题单简介 题目解析 P5733[深基6.例1]自动修正 P1914 小书童--密码 P1125 笨小猴 P1957 口算练习题 P5015 标题统计 P5734[深基6.例6]文字处理软件 P1308 ...

  8. 【OJ】洛谷数组题单题解锦集

    题单简介 题目解析 P1428 小鱼比可爱 P1427 小鱼的数字游戏 P5727[深基5.例3]冰雹猜想 P1047 校门外的树 P5728[深基5.例5]旗鼓相当的对手 P5729[深基5.例7] ...

  9. 【OJ】洛谷排序题单题解锦集

    题单简介 题目解析 P1271[深基9.例1]选举学生会 P1177[模板]快速排序 P1923[深基9.例4]求第 k 小的数 P1059 明明的随机数 P1093 奖学金 P1781 宇宙总统 P ...

最新文章

  1. 开源-BDCI2018供应链需求预测模型第一名解决方案和代码
  2. [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
  3. 计算机操作员实操高级试题,计算机操作员高级实操(以往考过,可做平时练习素材)答题.doc...
  4. 小米回应“上海徐汇拿地”:不用于造车
  5. centos 编译安装 mysql_CentOS7编译安装MySQL5.7.24的教程详解
  6. 百度云同盘在计算机显示不出来的,电脑打不开百度网盘里面的视频如何解决
  7. 打印纸张尺寸换算_纸张尺寸对照表
  8. 实验一 Matlab语音处理基本指令
  9. Unity3d 周分享(16期 2019.5.1 )
  10. 介绍erp管理软件如何助力小微企业管理升级?
  11. 分享一个能对java代码进行“tokenize”的python库
  12. transform.position 绝对位置与相对位置
  13. Linux管道符|命令使用
  14. 《余世维有效沟通》学习笔记
  15. iphone一键转移_苹果手机如何一键转移数据 转移教程介绍
  16. 什么是LoRaWAN
  17. 【单调队列优化dp】jzoj4883灵知的太阳信仰 纪中集训提高B组
  18. Identity-Aware Textual-Visual Matching with Latent Co-attention文章翻译学习(ICCV)
  19. office web apps安装部署 Win 2008 安装
  20. STM32上第一个程序-GPIO控制LED-第3季第5部分-朱有鹏-专题视频课程

热门文章

  1. 利用for循环打印实心棱形和空心棱形
  2. y7000电脑键盘使用不了_[电脑]致敬Cherry G80——J80 R2 87客制化键盘使用评测
  3. 微信小程序保留小数点
  4. python群控手机_(干货)带你用 Python 实现自动化群控(零基础入门篇)
  5. 路帮网的加油站开放接口
  6. shell 向 awk 传参
  7. 云顶之弈机器人怎么拉人_LOL云顶之弈10.16b机器人怎么玩_云顶之弈10.16b机器人装备站位_3DM网游...
  8. 《编写高质量代码:改善Objective-C程序的61个建议》——建议8:C语言与Objective-C语言的关系是充分而非必要条件...
  9. CentOS 7使用samba共享文件夹
  10. ios使用el-select的远程搜索无法唤起软键盘