循环相克
很早之前在acwing就做过类似这样的题目,依稀记得方法,但是没有归纳,今天又在pat的进阶题里面遇到差不多的题型,所以就归纳一下。
题目描述
基本上会形成一个闭环,类似石头剪刀布这种,石头克剪刀,剪刀克布,布克石头。一般题目给出两种类型,让你输出他们其中关系。比如pat中进阶题,相生相克中,告知水克火以及一系列。要求告知关系,比如 “A ke B”“A sheng B”。
思路
我认为比较简单的做法就是取模。
比如:
A 克 B,B克C,C克A
每次输入"A B"要求输出AB之间关系
令A = 0,B = 1,C= 2
A+1%3 = 1
B+1%3 = 2
C+1%3 = 0
此时有几种情况
- 两个输入数相同
这种就没什么可说的判断一下就行了 - 输入数不同
我们的做法是让后面的数取模后与前面的数进行比较。
我们发现
B = A+1%3 ; C=B+1%3 ; A=C+1%3
也就是说当前一个数等于后一个取模时,那么第二个数一定是克第一个数的。
代码
if(x==y){
cout<<"平手"<<endl;
}else if(x==(y+1)%3){
cout<<"第一个数大于第二个数"<<endl;
}else{
cout<<"第一个数小于第二个数"<<endl;
}
总结
遇到这种问题
- 将给出元素换算成数字,
- 找出规律取模后等于元素代表数字,就可以解决问题。