- 游戏规则,计算机想一个单词让你猜,你每次可以猜一个字母,如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母
- 则计算机会在一副“刽子手”画上填一笔,这幅画一共需要7笔就能完成,因此你最多只能错6次。注意猜一个已经猜过的字母也算错。
- 在本题中,你的任务是编写一个“裁判”程序,输入单词和玩家的猜测,判断玩家赢了,(You win.)、输了(You lose.)、还是放弃了(You chickened out.)
- 每组包含3行,第一行是游戏编号(-1为输入结束标记),第2行是计算机想的单词,第3行是玩家的猜测。后两行保证只含小写字母。
这题跟着小紫薯刷的,Uva真的有点逗啊..相同的代码第一次WA,第二次WA,第三次改了 MAXN=1000 就AC了,再提交一次没改过的也AC了。。
刷个小水不容易..还卡我这么久,问苍天问大地,我踏马又哪里错了!!!
小人需要七笔完成,就等于说你有六次机会,第七次错的时候,小人就 game over 咯。
核心思想就是一个 Guess 函数,假设电脑给你的字符串长度为 6 ,那么你需要抵消的次数为6。
用户所猜想的字符串存入 guess 数组,做一个从头到尾的循环,将每次从 guess[ ] 中拿到的字母与 ans[ ]的每个元素比较,
如果这个 guess[] 中拿到的元素与 ans[ ] 某一元素相等,则抵消次数减一。
第二个样例:
2
ans[]:cheese
guess[]:abcdefg
1)游戏者猜想的一个字母 guess[0] 为 ‘a’ ,而 ans[ ] 里没有这个元素,机会减一;
2)直到,guess[2] 为‘ c’ ,与 ans[ 0 ] 的元素抵消,为了体现抵消,将 ans[0] 内存储的元素改为 ‘ ’ (空格),抵消次数减一;
3)guess[ 4 ] 为 ‘ e ’ 将 ans 中所有的 ‘ e ’ 元素抵消,存储元素改为 ‘ ’ (空格),抵消次数减去三;
4)此时游戏者猜想的字符串已经全部比较完毕,黑色的字母代表猜错,机会减去五,现在机会为 2 表明还有机会,游戏者却不在出字母猜测,因而输出放弃,“You chickened out. ”
0.075s AC 代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
using namespace std;
const int MAXN = 100;
char ans[MAXN],guess[MAXN];
int len,chance;
int win,lose;
void Guess( char ch )
{
int bad = 1;
for( int i = 0 ;i <strlen(ans);++i)
if( ans[i] == ch)
{
len--;
ans[i] = ' ';
bad = 0;
}
if( bad )--chance;
if( !chance )lose = 1;
if( !len )win = 1;
}
void Work()
{
int glen = strlen(guess);
for( int i = 0; i < glen ; ++i)
{
Guess( guess[i] );
if( win || lose )break;
}
}
void Output(int &n)
{
printf("Round %d\n",n);
if( win )
puts("You win.");
else
if( lose )
puts("You lose.");
else
puts("You chickened out.");
}
int main()
{
// freopen("in.txt","r",stdin);
int n;
while ( ~scanf("%d%*c",&n) && ( n!=-1))
{
gets(ans);
gets(guess);
win = lose = 0;
len = strlen(ans);
chance = 7;
Work();
Output(n);
}
return 0;
}