题目描述
小 X 凭借出色的棋艺被聘请为少年宫的中国象棋老师。少年宫改造以后所有的设施都焕然一新,象棋教室已不再使用传统的木制棋子和棋盘了,小朋友们所有的操作都是在电脑上进行的,如猜先、对弈、复盘、计算积分等,这给老师的备课带来了极大的挑战,因为除了正常的棋艺教学,还要开发各种应用程序来辅助教学。众所周知任何棋类运动开局前都要猜先,如围棋项目猜先仪式是由上手抓起一把围棋子让对手猜单双,猜中先行。而象棋则是甲、
乙两人同时从各自的棋盒中摸出一枚棋子比大小,连续比三次,获胜次数多的一方执红先行,另一方则执黑后行。因现在所有的操作都要在电脑上实现,小 X 需要编写一个象棋猜先程序,具体任务如下:象棋中有七种棋子,分别是帅、士、相、车、马、炮、兵,程序中用 7,6,5,4,3,2,1表示,定义大小的规则为:帅>士>相>车>马>炮,兵最弱,除了帅之外的棋子都比兵大,士>相>车>马>炮>兵,但兵却能吃帅,即兵>帅。猜先程序要能实现以下功能:输入三行数据,每行两个棋子的编号,判断谁胜谁负。小 X 觉得这个程序太简单了,于是交给了参加本次比赛的你来完成。
输入:
输入数据共有两行,第一行为一个正整数 n,表示小 X 共进行了 n 次投篮,第二行为一个由 n 个字符组成的字符串,该字符串只包含三种字符,分别是大写字母’V’,’T’,’X’,其中’V’表示投中了,’T’表示没投中但不用扣分,’X’表示要扣 1 分。
输出:
输出一行包含一个单词,如甲获胜的次数比乙多则输出“Win”,如乙获胜的次数多则输出“Lose”,如甲乙两人获胜次数相同则输出“Tie”。请注意大小写,引号不用输出!
样例:
输入
8
VVVVVTXV
输出
8
提示
样例解释
小 X 先连续投中 5 个球,得到 5+3 分,其中 3 分为额外奖励到的。接着第六个球没投中也没扣分,第七个球扣了 1 分,最后一球得 1 分,因此答案为 8。
数据范围
对于 20%的数据 n<=10
另外 20%的数据不存在连续的 3 个’V’
另外 30%的数据不存在’X’
100%的数据 n<=10000
常州市2019“信息与未来”夏令营选拔赛
答案一:
基本的for循环,计分规则就是,投第1、2个球的时候,每个球1分,连续投到3个球以上的时候,每个球得2分,代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;//投球总次数
char h;//当前投球结果
int m=0;//连续投中次数
int s = 0;
cin>>n;
for(int i = 0; i < n; i++)
{
cin>>h;
if(h=='V')
{
//投中
m++;//连续投中次数记数
s++;//分数记数
if(m>=3)
{
s++;//连续3个以上,每次记两分
}
}
else if(h=='T')
{
m = 0;
}
else if(h=='X')
{
//扣分
s--;
m = 0;
}
}
cout<<s<<endl;
return 0;
}
这种方式明显理解容易。
答案二:
另外一种解题方式。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;//投球总次数
char h;//当前投球结果
int m=0;//连续投中次数
int s = 0;
cin>>n;
for(int i = 0; i < n; i++)
{
cin>>h;
if(h=='V')
{
//投中
m++;//连续投中次数记数
s++;//分数记数
}
else if(h=='T')
{
//不扣分
if(m>2)
{
s = s + (m-2);
}
m = 0;
}
else if(h=='X')
{
//扣分
s--;
if(m>2)
{
s = s + (m-2);
}
m = 0;
}
}
if(m>2)
{
s = s + (m-2);
}
cout<<s<<endl;
return 0;
}
这种方式,明显比较绕,麻烦。
完整题目请下载https://download.csdn.net/download/chenxiaohua/13216336
微信交流