//我在简书发布的第一篇文章~~
摘要:
实现一个经典的“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列中都出现过但位置不对(B)。
题目翻译:
详见https://www.luogu.org/problemnew/show/UVA340
MasterMind是一款双人游戏。玩游戏时,其中一个人充当设计者,想一个序列(答案序列)。另一个人(即破解者)尝试去猜出答案序列。一个序列无非不过是一行彩色的点。在游戏的开始,玩家们会一起规定一个序列的长度N以及在一个序列中可能出现的颜色。
为了猜出原序列,破解者要做出许许多多的猜测,每一次猜测就是(给出)一个猜测序列。在每一次猜测之后,设计者要给出一个暗示/提示/线索……
PS。题干是说序列的元素是彩色的点,但是看到输入输出时,很显然,出题者把问题进行了抽象和简化,将“colorful dots”抽象成了整数,并简化为1~9。
求解:
A的求法:显然,未知正确,就是遍历整个猜测序列的数组guess[i],和答案序列对应相等guess[i]==answer[i],计数器cnt++即可(记得要cnt初始化为0哦);
B的求法:我一开始认为,它存在歧义。
“都出现过”,应该是指1~9中某一个,比如X和Y,在guess[]和answer[]中都出现过;
“位置不对”,
可以是指guess[i]!=answer[I]
也可以是指“X!=Y && guess[I]==X && answer[I]==Y”而且不存在“guess[I]==X && X==answer[I] || answer[j]==Y && Y==answer[j]”
也可以是指“guess[I]=X && X==answer[j] && I!=j”;
sample(测试样例) 告诉我,最后那一种解释,应该是正解。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define min(x,y) x>y?y:x
int main(){
int n,cnt=1;
scanf("%d",&n);
while(n!=0){
printf("Game %d:\n",cnt);
cnt++;
int flag=0,a,b;
int answer[n+10],guess[n+10],count[10],count_guess[10];
memset(count,0, sizeof(count));
for (int i = 0; i < n; ++i) {
scanf("%d",&answer[i]);
count[answer[i]]++;
}
a=b=0;
memset(count_guess,0, sizeof(count_guess));
for (int j = 0; j < n; ++j) {
scanf("%d",&guess[j]);
if (guess[j]==answer[j]){
a++;
}
if (guess[j]!=0){
flag=1;
}
count_guess[guess[j]]++;
}
while (flag){
flag=0;
for (int i = 1; i < 10; ++i) {
b+=min(count[i],count_guess[i]);
}
b-=a;
printf("\t(%d,%d)\n",a,b);
a=b=0;
memset(count_guess,0, sizeof(count_guess));
for (int j = 0; j < n; ++j) {
scanf("%d",&guess[j]);
if (guess[j]==answer[j]){
a++;
}
if (guess[j]!=0){
flag=1;
}
count_guess[guess[j]]++;
}
}
scanf("%d",&n);
}
return 0;
}
尾声:
不到10分钟前,刚刚见证了一次502,太真实了,没想到这么快就好了。
同行们(学长学姐们)加油!
(https://img.haomeiwen.com/i16466890/165b1207d5e9138c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
网友评论