题目链接:https://vjudge.net/problem/UVA-489
题意:给出两行字符串,第一行是标准答案,第二行是玩家猜的串。玩家每次猜一个,猜对一个,标准答案中所有该字符都算被猜到。猜错的次数不能到达七次。多次因同一个字符猜错算猜错一次(这个条件没有用)。
猜对,没猜对且错了七次,没猜对但还没错到七次
分别输出
You win.
You lose.
You chickened out.
题解:模拟,莫名奇妙wa了一个小时。各种修改。
以至于找到了一组数据,oj检测不出来,手算明显是错的:
word
aerbmzagword
ac代码是You lose., 手算是You win.
其实我错的是这一行:
24 if (a[s2[i]]==1)a[s2[i]] = 0, num--;
之前写成了 a[s2[i]] = -1
这样的话如果下次再次出现之前已经猜到了的字符,会计算一次错误,然后gg(紫书写的“猜一个已经猜过的字母也算错”是错的,我敲了一遍书上的代码也是wa的)
(坑)
附ac代码:用了字符为下标的数组a[256]来简化,num来判断是否全部猜到,
1 #include<string.h> 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 7 int a[256]; 8 int main() 9 { 10 int n; 11 int kase = 1; 12 while (cin >> n) { 13 if (n == -1)break; 14 string s1, s2; 15 cin >> s1 >> s2; 16 memset(a, -1, sizeof(a)); 17 int len = s1.size(); int num = 0; 18 for (int i = 0; i < len; i++)if (a[s1[i]]==-1) { 19 a[s1[i]] = 1; num++; 20 } 21 int cnt = 0; int ok = 0; 22 len = s2.size(); 23 for (int i = 0; i < len; i++) { 24 if (a[s2[i]]==1)a[s2[i]] = 0, num--; 25 //else cnt++;(替代下一行也ac) 26 if (a[s2[i]] == -1)cnt++; 27 if (cnt >= 7)break; 28 if (num == 0) { 29 break; 30 } 31 } 32 cout << "Round "; 33 cout << n << endl; 34 if (num==0)cout << "You win." << endl; 35 else if (cnt >= 7)cout << "You lose." << endl; 36 else cout << "You chickened out." << endl; 37 } 38 39 return 0; 40 41 }
原文地址:https://www.cnblogs.com/SuuT/p/8510842.html
时间: 2024-11-06 13:51:41