题目大意如下:微信跳一跳游戏,输入1,2,,0三个数字;
1代表跳到了下一个盒子但不在中心,得分为1,总分加1;
2代表跳到了下一个盒子且在中心;根据上次的得分计算:如果上一次得分为1,那此次得分为2,总分加2分,如果上一次得分为2,那此次得分为4,总分加4;以此类推:如上一次得分为8分,这次又跳到了盒子中心,那此次得分为10分,总分加10;
0代表没有跳到盒子上,游戏结束。
-------------------------------------------------------------------------------------------------------
输入要求:一组整数(1,2,0),空格隔开,保证以0结尾,且一组数据有且只有一个0。
输入:1 1 2 2 1 1 2 2 2 0
输出:22
输出描述为:1+1+2+4+1+1+2+4+6= 22
-------------------------------------------------------------------------------------------------------
这是我的代码1.0(C++):(得分为0的版本)
#include <iostream>
using namespace std;
int main(){
int n;//输入
int first=1;//判断是否为第一个输入
int ans=0;//输出的结果
int p=0;//连续跳到中心点的次数
while(n){
cin>>n;
if(n==1){//如果输入为1;
ans++;
first=0;//第一个输入的标志位记0;
p=0;//未跳到中心点,p为0;
}
else if(n==2){//如果输入为2;
if(first==1){//判断第一次是否跳到中心点
ans=ans+2;
}
++p;//次数累加
ans=ans+2*p;//跳到中心点,结果累加
}
}
cout<<ans;//输出结果
}
-------------------------------------------------------------------------------------------------------
这是我的1.0的测试输出:
-------------------------------------------------------------------------------------------------------
今天查成绩时候,发现这道题目CCF给了我0分。。。输出也都是对的呀,为什么会出现0分的情况呢??
请各位大佬赐教,方便日后改正!
分割线:-----------------------------------------------------------------------------------------------
2018年3月20日:
在大佬的帮助下,今天发现了这个错误:对于2 1 0的输入,对于2的情况,多做了一次的计算,导致输出为5,实际上是3;
-------------------------------------------------------------------------------------------------------
这是我修改后的代码2.0(C++)(在输入为2的处理上,避免了重复计算,加了一个else)
#include <iostream>
using namespace std;
int main(){
int n;//输入
int first=1;//判断是否为第一个输入
int ans=0;//输出的结果
int p=0;//连续跳到中心点的次数
while(n){
cin>>n;
if(n==1){//如果输入为1;
ans++;
first=0;//第一个输入的标志位记0;
p=0;//未跳到中心点,p为0;
}
else if(n==2){//如果输入为2;
if(first==1){//判断第一次是否跳到中心点
ans=ans+2;
p++;
first=0;
}
else{//处理第一次以后跳到中心点的问题
ans=ans+2*(p+1);
p++;
}
}
}
cout<<ans;//输出结果
}
-------------------------------------------------------------------------------------------------------
这是我的2.0的测试输出:
-------------------------------------------------------------------------------------------------------
确实很不应该,犯了这么低级的错误,还是自己的编程的基本功不够扎实,设置测试用例的时候,也是不够全面,以为通过了一些常见的测试就放松了警惕,变得麻痹大意,最后检查的时候也不用心,希望以后不会再犯吧。
因为这个致命的失误,可能导致自己以后没有机会再去敲代码了。再见了,NUDT。
ORZ。
-------------------------------------------------------------------------------------------------------
3.0版本(比较简洁,省去了判断是否为第一次的情况)
#include<iostream>
using namespace std;
int main(){
int n;
int ans=0;
int point=0;
while(1){
cin>>n;
if(n==0){
break;
}
else if(n==1){
ans++;
point=0;
}
else if(n==2){
ans=ans+2*(point+1);
point++;
}
}
cout<<ans;
return 0;
}