//1132:石头剪子布第一版本:完整暴力列举#includeusingnamespacestd;intmain(){intn;stringp1,p2;cin>>n;for(inti=1;i<=n;i++){cin>>p1>>p2;if(p1=="Rock"&&p2=="Scissors"||p1=="Scissors"&&p2=="Paper"||p1=="Paper"&&p2=="Rock"){cout<<"Player1\n";}elseif(p1==p2){cout<<"Tie\n";}elsecout<<"Player2\n";}return0;}第一版本在第一版本里可以做一点小优化,我们注意到三个单词的首字母不用,故我们也可以直接用首字母判断即可,这样可避免字母太多,出现拼写错误。于是有了第二版本:
//1132:石头剪子布第二版本-部分暴力列举#includeusingnamespacestd;intmain(){intn;charp1[10],p2[10];cin>>n;for(inti=1;i<=n;i++){cin>>p1>>p2;if(p1[0]=='R'&&p2[0]=='S'||p1[0]=='S'&&p2[0]=='P'||p1[0]=='P'&&p2[0]=='R'){cout<<"Player1\n";}elseif(p1[0]==p2[0]){cout<<"Tie\n";}elsecout<<"Player2\n";}return0;}第二版本对于C++编程,我们还要学会模块化编程思想,即可以把一些特定的功能编成一个函数,这些可以提高代码的利用率,也可以增加程序的可读性和减少程序维护代价。对本题而言,我们完全可以把判断过程写成一个函数,这样可以大大减少主程序的复杂度,特别是在以后程序变得更加复杂后,模块化是必然趋势。于得得到第三版本:
//1132:石头剪子布第三版本-普通函数#includeusingnamespacestd;stringrsp(stringp1,stringp2){stringrerult;if(p1[0]=='R'&&p2[0]=='S'||p1[0]=='S'&&p2[0]=='P'||p1[0]=='P'&&p2[0]=='R'){rerult="Player1\n";}elseif(p1==p2){rerult="Tie\n";}elsererult="Player2\n";returnrerult;}intmain(){intn;stringp1,p2;cin>>n;for(inti=1;i<=n;i++){cin>>p1>>p2;cout<p1的对应值-p2对应值=-1或2,从余数角度完全可以是同一个。为了解决负数问题,我们先加一个3,再对3取余数,那-1和2是等价的了,都将转换成2。至此,程序便可以修改为第四版本:
//1132:石头剪子布第四版本-赋值函数#includeusingnamespacestd;intrsp(strings){if(s[0]=='R')return1;if(s[0]=='S')return2;return3;}intmain(){intn;stringp1,p2;cin>>n;for(inti=1;i<=n;i++){cin>>p1>>p2;if(p1==p2)cout<<"Tie\n";elseif((rsp(p2)-rsp(p1)+3)%3==1)cout<<"Player1\n";elsecout<<"Player2\n";}return0;}第四版本再对照上例中(rsp(p2)-rsp(p1)+3)%3这一个表达式可能出现的值为0、1、2,而我们最终结果也正好是三种,那我们可以把三种结果存入数组,用(rsp(p2)-rsp(p1)+3)%3做下标,直接调用结果,于是便有第五版本:
//1132:石头剪子布第五版本-数组函数#includeusingnamespacestd;intrsp(strings){if(s[0]=='R')return1;if(s[0]=='S')return2;return3;}intmain(){intn;stringp1,p2,rerult[3]={"Tie\n","Player1\n","Player2\n"};cin>>n;for(inti=1;i<=n;i++){cin>>p1>>p2;cout<//1132:石头剪子布第六版本-STL库函数#include#include