洛谷算法题单:模拟与高精度例题(下)
接着上篇的例题。
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;
}
洛谷算法题单:模拟与高精度例题(下)相关推荐
- 洛谷算法题单:模拟与高精度例题(上)
一:模拟 想要利用计算机解决现实生活中的一些复杂的问题时,建立模型是解决问题的关键. 举个生活中常见的例子:我们拿到了某次数学考试的成绩单,现在需要知道谁考得最好.当然不能把成绩单对着电脑晃一晃,然后 ...
- python【洛谷算法题单-搜索】P1605 迷宫
题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次只能移 ...
- 洛谷oj题单【入门2】分支结构-入门难度(Java)
洛谷oj题单[入门2]分支结构-入门难度(Java) 来源:https://www.luogu.com.cn/training/101#problems P5709 [深基2.习6]Apples Pr ...
- 洛谷日常刷题(洛谷官方题单 思路+详解)
目录 前言 非官方题单的题 P1141 01迷宫 1-4 递推与递归 P1255 数楼梯 1002 [ NOIP 2002 普及组]过河卒 P1044 [NOIP2003 普及组] 栈 P1028 [ ...
- 洛谷-官方题单版【入门篇】
文章目录 [入门1]顺序结构 P1000 超级玛丽游戏 *P5704 [深基2.例6]字母转换 P5705 [深基2.例7]数字反转 P1425 小鱼的游泳时间 P1421 小玉买文具 P3954 [ ...
- 洛谷入门题单 --【入门1】顺序结构 题解
- [P1001 A+B Problem] - [P1000 超级玛丽游戏] - [P5703 [深基2.例5]苹果采购] - [P5704 [深基2.例6]字母转换] - [P5705 [深基2.例 ...
- 【OJ】洛谷字符串题单题解锦集
题单简介 题目解析 P5733[深基6.例1]自动修正 P1914 小书童--密码 P1125 笨小猴 P1957 口算练习题 P5015 标题统计 P5734[深基6.例6]文字处理软件 P1308 ...
- 【OJ】洛谷数组题单题解锦集
题单简介 题目解析 P1428 小鱼比可爱 P1427 小鱼的数字游戏 P5727[深基5.例3]冰雹猜想 P1047 校门外的树 P5728[深基5.例5]旗鼓相当的对手 P5729[深基5.例7] ...
- 【OJ】洛谷排序题单题解锦集
题单简介 题目解析 P1271[深基9.例1]选举学生会 P1177[模板]快速排序 P1923[深基9.例4]求第 k 小的数 P1059 明明的随机数 P1093 奖学金 P1781 宇宙总统 P ...
最新文章
- 开源-BDCI2018供应链需求预测模型第一名解决方案和代码
- [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
- 计算机操作员实操高级试题,计算机操作员高级实操(以往考过,可做平时练习素材)答题.doc...
- 小米回应“上海徐汇拿地”:不用于造车
- centos 编译安装 mysql_CentOS7编译安装MySQL5.7.24的教程详解
- 百度云同盘在计算机显示不出来的,电脑打不开百度网盘里面的视频如何解决
- 打印纸张尺寸换算_纸张尺寸对照表
- 实验一 Matlab语音处理基本指令
- Unity3d 周分享(16期 2019.5.1 )
- 介绍erp管理软件如何助力小微企业管理升级?
- 分享一个能对java代码进行“tokenize”的python库
- transform.position 绝对位置与相对位置
- Linux管道符|命令使用
- 《余世维有效沟通》学习笔记
- iphone一键转移_苹果手机如何一键转移数据 转移教程介绍
- 什么是LoRaWAN
- 【单调队列优化dp】jzoj4883灵知的太阳信仰 纪中集训提高B组
- Identity-Aware Textual-Visual Matching with Latent Co-attention文章翻译学习(ICCV)
- office web apps安装部署 Win 2008 安装
- STM32上第一个程序-GPIO控制LED-第3季第5部分-朱有鹏-专题视频课程
热门文章
- 利用for循环打印实心棱形和空心棱形
- y7000电脑键盘使用不了_[电脑]致敬Cherry G80——J80 R2 87客制化键盘使用评测
- 微信小程序保留小数点
- python群控手机_(干货)带你用 Python 实现自动化群控(零基础入门篇)
- 路帮网的加油站开放接口
- shell 向 awk 传参
- 云顶之弈机器人怎么拉人_LOL云顶之弈10.16b机器人怎么玩_云顶之弈10.16b机器人装备站位_3DM网游...
- 《编写高质量代码:改善Objective-C程序的61个建议》——建议8:C语言与Objective-C语言的关系是充分而非必要条件...
- CentOS 7使用samba共享文件夹
- ios使用el-select的远程搜索无法唤起软键盘