程序设计思维 week10 限时大模拟-魔方
A-字符串ST
题目
东东有一个字符串X,该串包含偶数个字符,一半是 S 字符,一半是 T 字符
东东可以对该字符串执行 1010000 次操作:如果存在 ST 是该串的子串,则删除掉最左边的 ST。
即 TSTTSS⇒TTSS、SSSTTT⇒SSTT⇒ST⇒空
Input
(2 ≦ |X| ≦ 200,000)
Output
输出最终串的长度
Sample Input
TSTTSS
Sample Output
4
思路
类似于括号匹配,利用栈。
当前字符s[i]为’S’时,当前字符入栈;栈不为空且当前字符s[i]为’T’且栈顶字符st.top()为’S’时,弹出栈顶元素。最后输出栈中元素个数。
总结
一开始没有想到栈,自己使用两个变量记录下标模拟了上述思路的过程,但是会wa。后来忽然想起栈,又重写了代码,但是re,发现是弹出栈顶元素时没有判断栈为空。
代码
#include<iostream>
#include<string>
#include <stack>
#include<algorithm>
using namespace std;int main(){string s;cin>>s;stack<char> st;for(int i=0;i<s.length();i++){if(i==0)st.push(s[i]);else{if(!st.empty()&&st.top()=='S'&&s[i]=='T'){st.pop();}else{st.push(s[i]);}}}cout<<st.size();return 0;
}
B-东东转魔方
题目
东东有一个二阶魔方,即2×2×2的一个立方体组。立方体由八个角组成。
魔方的每一块都用三维坐标(h, k, l)标记,其中h, k, l∈{0,1}。六个面的每一个都有四个小面,每个小面都有一个正整数。
对于每一步,东东可以选择一个特定的面,并把此面顺时针或逆时针转90度。
请你判断,是否东东可以在一个步骤还原这个魔方(每个面没有异色)。
Input
输入的第一行包含一个整数N(N≤30),这是测试用例的数量。
对于每个测试用例, 第 1~4 个数描述魔方的顶面,这是常见的2×2面,由(0,0,1),(0,1,1),(1,0,1),(1,1,1)标记。四个整数对应于上述部分。
第 5~8 个数描述前面,即(1,0,1),(1,1,1),(1,0,0),(1,1,0)的公共面。四个整数 与上述各部分相对应。
第 9~12 个数描述底面,即(1,0,0),(1,1,0),(0,0,0),(0,1,0)的公共面。四个整数与上述各部分相对应。
第 13~16 个数描述背面,即(0,0,0),(0,1,0),(0,0,1),(0,1),(0,1,1)的公共面。四个整数与上述各部分相对应。
第 17~20 个数描述左面,即(0,0,0),(0,0,1),(1,0,0),(1,0,1)的公共面。给出四个整数与上述各部分相对应。
第 21~24 个数描述了右面,即(0,1,1),(0,1,0),(1,1,1),(1,1,0)的公共面。给出四个整数与上述各部分相对应。
换句话说,每个测试用例包含24个整数a、b、c到x。你可以展开表面以获得平面图,如下所示。
+ - + - + - + - + - + - +
| q | r | a | b | u | v |+ - + - + - + - + - + - +
| s | t | c | d | w | x |+ - + - + - + - + - + - +| e | f |+ - + - +| g | h |+ - + - +| i | j |+ - + - +| k | l |+ - + - +| m | n |+ - + - +| o | p |+ - + - +
Ouput
对于每个测试用例,魔方如果可以至多 “只转一步” 恢复,输出YES,则输出NO。
Sample Input
4
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6
6 6 6 6 1 1 1 1 2 2 2 2 3 3 3 3 5 5 5 5 4 4 4 4
1 4 1 4 2 1 2 1 3 2 3 2 4 3 4 3 5 5 5 5 6 6 6 6
1 3 1 3 2 4 2 4 3 1 3 1 4 2 4 2 5 5 5 5 6 6 6 6
Sample Output
YES
YES
YES
NO
思路
使用cube[]数组记录每个方格的颜色,题目中的a~x面分别对应cube[1]~cube[24]。
按照题目描述摆放魔方确定上下左右前后面,可以分为四种情况:
- 上下面颜色相同,需要转前后左右面;
- 前后面颜色相同,需要转上下前后面;
- 左右面颜色相同,需要转上下前后面;
- 其他。
对于前三种情况,每种情况中又可以分出两种情况:
- 顺时针转90度;
- 逆时针转90度(即顺时针转270度)。
在代码中,用必要条件判断进入四种情况的哪一个,判断分别是:
- 前面中靠上的2个方格颜色相同,靠下的2个方格颜色相同,且两者颜色不同;
- 上面中靠前的2个方格颜色相同,靠后的2个方格颜色相同,且两者颜色不同;
- 上面中靠左的2个方格颜色相同,靠右的2个方格颜色相同,且两者颜色不同。
- 其他。
对于四种情况,再转到其对应的顺/逆时针转90度的函数或不转的函数,看操作后是否还原成功。
判断是否还原成功对着折好的魔方看就好了。
总结
我太懒了,懒得折魔方。一开始想用三维坐标记录颜色,写着写着发现一个小魔方块有三面,也就是三个颜色,而我只用了一个坐标来表示一个小魔方块,就很尴尬。
折个魔方又不费力,为什么不折一个呢。
代码
#include <algorithm>
#include <cstdio>
using namespace std;
int cube[26];bool solve1(){//上下前后转for(int i=17;i<20;i++){//左面是否同色,右面是否同色if(cube[i]!=cube[i+1]||cube[i+4]!=cube[i+5])return false;}if(cube[5]==cube[7]&&cube[6]==cube[8]&&cube[9]==cube[11]&&cube[10]==cube[12]&&cube[13]==cube[15]&&cube[14]==cube[16]){if(cube[3]==cube[6]&&cube[7]==cube[10]&&cube[11]==cube[14]&&cube[15]==cube[2])return true;if(cube[1]==cube[16]&&cube[13]==cube[12]&&cube[9]==cube[8]&&cube[5]==cube[4])return true;}return false;
}
bool solve2(){//上下左右转for(int i=5;i<8;i++){//前面是否同色,后面是否同色if(cube[i]!=cube[i+1]||cube[i+8]!=cube[i+9])return false;}if(cube[21]==cube[22]&&cube[23]==cube[24]&&cube[9]==cube[10]&&cube[11]==cube[12]&&cube[17]==cube[18]&&cube[19]==cube[20]){if(cube[2]==cube[23]&&cube[22]==cube[10]&&cube[11]==cube[19]&&cube[18]==cube[3])return true;if(cube[1]==cube[20]&&cube[17]==cube[9]&&cube[12]==cube[24]&&cube[21]==cube[4])return true;}return false;
}
bool solve3(){//前后左右转for(int i=1;i<4;i++){if(cube[i]!=cube[i+1]||cube[i+8]!=cube[i+9])return false;}if(cube[21]==cube[23]&&cube[22]==cube[24]&&cube[15]==cube[16]&&cube[13]==cube[14]&&cube[18]==cube[20]&&cube[17]==cube[19]){if(cube[6]==cube[24]&&cube[21]==cube[14]&&cube[15]==cube[17]&&cube[20]==cube[7])return true;if(cube[5]==cube[19]&&cube[18]==cube[13]&&cube[16]==cube[22]&&cube[23]==cube[8])return true;}return false;
}
bool solve4(){//不转for(int i=1;i<4;i++){for(int j=0;j<6;j++){if(cube[i+j*4]!=cube[i+j*4+1])return false;}}return true;
}bool solve(){if(cube[1]==cube[3]&&cube[2]==cube[4]&&cube[1]!=cube[2])return solve1();if(cube[1]==cube[2]&&cube[3]==cube[4]&&cube[1]!=cube[3])return solve2();if(cube[5]==cube[6]&&cube[7]==cube[8]&&cube[5]!=cube[7])return solve3();return solve4();
}int main(){int n;scanf("%d",&n);while(n--){for(int i=1;i<=24;i++)scanf("%d",&cube[i]);if(solve())printf("YES\n");elseprintf("NO\n");}return 0;
}
题目链接
程序设计思维 week10 限时大模拟-魔方相关推荐
- Week10 限时大模拟 B - 东东转魔方 HDU - 5983
题目描述 东东有一个二阶魔方,即2×2×2的一个立方体组.立方体由八个角组成. 魔方的每一块都用三维坐标(h, k, l)标记,其中h, k, l∈{0,1}.六个面的每一个都有四个小面,每个小面都有 ...
- 山大程序设计思维与实践 六月模拟:猪国杀
六月模拟:猪国杀 山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业H 山大程序设计思维实践作业H 山东大学程序设计思维 ...
- 作业Week9、10+月模拟题3、4+CSP3、4+限时大模拟10、14
CSP3 A-瑞神的序列 1.题意:瑞神的数学一向是最好的,连强大的咕咕东都要拜倒在瑞神的数学水平之下,虽然咕咕东很苦 恼,但是咕咕东拿瑞神一点办法都没有. 5.1期间大家都出去玩了,只有瑞神还在孜孜 ...
- 山东大学程序设计思维与实践 四月模拟:TT与可怜的猫
4月模拟-TT与可怜的猫 程序设计思维实践-复杂模拟题训练2 山东大学计算机科学与技术学院程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业 山大程序设计思维实践 山东大学程序 ...
- 程序设计思维与实践 Week14 限时大模拟A - 猫睡觉问题
题意 众所周知,TT家里有一只魔法喵.这只喵十分嗜睡.一睡就没有白天黑夜.喵喵一天可以睡多次!!每次想睡多久就睡多久╭(╯^╰)╮ 喵睡觉的时段是连续的,即一旦喵喵开始睡觉了,就不能被打扰,不然喵会咬 ...
- 程序设计思维与实践 Week14 限时大模拟
文章目录 A - 猫睡觉问题 题目 思路 代码 A - 猫睡觉问题 题目 众所周知,TT家里有一只魔法喵.这只喵十分嗜睡.一睡就没有白天黑夜.喵喵一天可以睡多次!!每次想睡多久就睡多久╭(╯^╰)╮ ...
- Week6 限时大模拟 A 掌握魔法の东东II
文章目录 题目描述 Input Output Sample Input 1 Sample Output 1 Sample Input 2 Sample Output 2 算法/思路分析 代码 题目描述 ...
- 程序设计思维与实践 Month3 模拟
文章目录 CSP 201609-3 炉石传说 1. 问题描述 2. 思路历程 3. 具体实现 4. 代码 CSP 201609-3 炉石传说 1. 问题描述 游戏在一个战斗棋盘上进行,由两名玩家轮流进 ...
- 程序设计思维与实践月模拟题X3
这里写目录标题 201604-3 路径解析 题目 思路 代码 201609-3 炉石传说 题目 思路 代码 201809-3 元素选择器 题目 思路 代码 201604-3 路径解析 题目 在操作系统 ...
最新文章
- Silverlight 2 beta 2 中目前不支持共享 WCF 的客户端类型
- 《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”
- 服务降级和服务熔断的区别_Spring Cloud 熔断 隔离 服务降级
- 一文搞懂JAVA与GO垃圾回收
- 深度学习框架Keras介绍及实战
- 真香定律!Android动态换肤实现原理解析,原理+实战+视频+源码
- 中国石油大计算机在线考试中心,中国石油大在线考试.doc
- 输入字符串统计字符串中每个字符出现的次数
- android 判断空,Android空判断的坑
- vue 子组件 调用、触发父组件中的方法
- 如何进入embl的ebi网站fasta3服务器,The EMBL-EBI bioinformatics web and programmatic tools framework...
- JZOJ 1238. 自行车比赛
- [hadoop新实战4]hadoop完全分布式安装序列(支持ubuntu和redhat)
- Exchange 2010 PowerShell
- 数据库问题6-將系統資料表對應至系統檢視
- WCF Data Services查询
- 大数据锁定消费者没用,核心是锁住用户的“脑袋”!
- 地图比例尺与空间分辨率之间的关系_卫星遥感制图最佳影像空间分辨率与地图比例尺关系探讨...
- java实现pdf的拆分和合并
- 这个牛逼的在线项目任务管理工具,终于开源了!