2 void cpp1 void_cpp1 于 2016.03.07 17:44 提问

刷ACM小伙伴进Uva oj 340 - Master-Mind Hints 3C

如题: Master-Mind Hints

MasterMind is a game for two players. One of them, Designer, selects a secret code. The other, Breaker, tries to break it. A code is no more than a row of colored dots. At the beginning of a game, the players agree upon the length N that a code must have and upon the colors that may occur in a code.

In order to break the code, Breaker makes a number of guesses, each guess itself being a code. After each guess Designer gives a hint, stating to what extent the guess matches his secret code.

In this problem you will be given a secret code tex2html_wrap_inline35 and a guess tex2html_wrap_inline37 , and are to determine the hint. A hint consists of a pair of numbers determined as follows.

A match is a pair (i,j), tex2html_wrap_inline41 and tex2html_wrap_inline43 , such that tex2html_wrap_inline45 . Match (i,j) is called strong when i = j, and is called weak otherwise. Two matches (i,j) and (p,q) are called independent when i = p if and only if j = q. A set of matches is called independent when all of its members are pairwise independent.

Designer chooses an independent set M of matches for which the total number of matches and the number of strong matches are both maximal. The hint then consists of the number of strong followed by the number of weak matches in M. Note that these numbers are uniquely determined by the secret code and the guess. If the hint turns out to be (n,0), then the guess is identical to the secret code.

Input

The input will consist of data for a number of games. The input for each game begins with an integer specifying N (the length of the code). Following these will be the secret code, represented as N integers, which we will limit to the range 1 to 9. There will then follow an arbitrary number of guesses, each also represented as N integers, each in the range 1 to 9. Following the last guess in each game will be N zeroes; these zeroes are not to be considered as a guess.

Following the data for the first game will appear data for the second game (if any) beginning with a new value for N. The last game in the input will be followed by a single zero (when a value for N would normally be specified). The maximum value for N will be 1000.

Output

The output for each game should list the hints that would be generated for each guess, in order, one hint per line. Each hint should be represented as a pair of integers enclosed in parentheses and separated by a comma. The entire list of hints for each game should be prefixed by a heading indicating the game number; games are numbered sequentially starting with 1. Look at the samples below for the exact format.

Sample Input

4
1 3 5 5
1 1 2 3
4 3 3 5
6 5 5 1
6 1 3 5
1 3 5 5
0 0 0 0
10
1 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
1 1 2 2 3 3 4 4 5 5
1 2 1 3 1 5 1 6 1 9
1 2 2 5 5 5 6 6 6 7
0 0 0 0 0 0 0 0 0 0
0
Sample Output

Game 1:
(1,1)
(2,0)
(1,2)
(1,2)
(4,0)
Game 2:
(2,4)
(3,2)
(5,0)
(7,0)

    大概意思就是猜数字的一个游戏,给定答案序列和用户猜的序列,统计有多少数字正确(A),有多少数字在两个序列都出现过但位置不对(B)。
    ps.猜测序列正常情况下数字只可能是1~9中的某一个。
    输入包含多组数据。每组输入第一行为序列长度为n,第二行是答案序列,接下来是若干猜测序列。猜测序列全零则该组数据结束。n=0输入结束。
    下面是我的代码:
#include <stdio.h>
int a[1050],b[1050];
int main()
{
    int n,round=0;
    while(scanf("%d",n)==1&&n){
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        printf("Game %d:\n",++round); //用round记录第几轮
        int num1=0,num2=0;
        for(;;){
            int c1=0,c2=0;
            for(int i=1;i<=n;i++){
                scanf("%d",&b[i]);
                if(b[i]==a[i])
                    num1++;   //直接统计可得A
                for(int j=1;j<=9;j++){
                    if(a[i]==j) c1++;
                    if(b[i]==j) c2++;
                }
            }
            if(b[1]==0) break;
            if(c1<c2)
                num2+=c1;
            else
                num2+=c2;
            printf("    (%d,%d)\n",num1,num2-num1);
        }
    }
    return 0;
}

最后编译没问题,可是出现dos窗口输入一个数字enter后就狗带了

就像下面这样,求大神解答啊囧
图片说明
图片说明

3个回答

caozhy
caozhy   Ds   Rxr 2016.03.07 17:53
u013596119
u013596119   Rxr 2016.03.07 18:02

第一个while的scanf的n少了&,但是跑完你的答案是不对的。。

  while(scanf("%d",&n)==1&&n){
void_cpp1
void_cpp1 谢谢,汗颜,在这个小地方栽跟头了囧
2 年多之前 回复
void_cpp1
void_cpp1   2016.03.07 19:15

重新梳理了下逻辑,现在应该行了

#include <stdio.h>
int a[1050],b[1050];
int main()
{
    int n,round=0;
    while(scanf("%d",&n)==1&&n){
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        round++;
        printf("Game %d:\n",round);
        for(;;){
            int num1=0,num2=0;
            for(int i=1;i<=n;i++){ //猜测序列赋值
                scanf("%d",&b[i]);
                if(b[i]==a[i]) num1++;
            }
            if(b[1]==0) break;
            for(int j=1;j<=9;j++){
                int c1=0,c2=0;  //在每一轮数字统计时初始化c1,c2
                for(int i=1;i<=n;i++){
                    if(a[i]==j) c1++;//c1记录在答案序列某数字的个数
                    if(b[i]==j) c2++;//c2记录在猜测序列中某数字的个数
                }
                if(c1<c2)
                    num2+=c1;
                else
                    num2+=c2;
                //c1,c2两者取其小
            }
            printf("    (%d,%d)\n",num1,num2-num1);
        }
    }
    return 0;
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
UVa Master-Mind Hints(猜数字+计数)
原题地址https://vjudge.net/problem/UVA-340 题意:猜数字游戏。给定答案序列和猜测序列,统计有多少数字正确(A),多少数字在两个序列中都出现过但位置不对应(B)。 解题思路本题是《算法竞赛入门经典》的例题3-4,原题的英文题目很复杂,但是玩过猜数字的都知道是什么意思 :) 猜测不限次数,输入0 0 0 0结束这轮猜测; 判断A非常简单,直接统计guess[i] =
UVA 340 Master-Mind Hints 猜数字提示的游戏 简单模拟
题意:以前曾经玩过的一个游戏,就是猜数字,原来的游戏规则是这样的: 請寫一個猜數字遊戲,電腦會產生一個四位數且每個數字都不重複的數字讓使用 者去猜,使用者猜測一組數字後,電腦會顯示 ?A?B 的訊息,A 代表正確的數字 數目,B 代表數字正確但位置不對的數字數目。 这边有个在线玩的网站:请戳这里,可能玩过了就会有点感觉了。 题目有点不同,它给出的密码是多位的,然后给出一系列的猜测,让
例题3-4 猜数字游戏的提示 UVa340
算法竞赛入门经典(第2版)第3章 数组和字符串 例题3-4 猜数字游戏的提示 UVa340 感悟。 1、自认为这个程序写得还可以。 2、开始阶段一团浆糊,只能从数据的输入输出入手,先整理好输入输出格式。 3、进行输入输出测试阶段,输入太繁琐,果断改成采用文件的方式(FILE *fin)输入数据,测试成功,提交时,再改成标准输入。 4、程序是每当输出结果不符要求,调试,输出结果还不符
猜数字游戏的提示(Master-Mind Hints,UVa 340)
猜数字游戏的提示 问题描述 实现一个经典的“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B)。 输入包含多组数据。每组输入第一行位序列长度n,第二行是答案序列,接下来是若干猜测序列。猜测序列全0时该组数据结束。n=0时输入结束。 样例输入: 4 1 3 5 5 1 1 2 3 4 3 3 5 ...
uva oj 340 - Master-Mind Hints
Master-Mind Hints MasterMind is a game for two players. One of them, Designer, selects a secret code. The other, Breaker, tries to break it. A code is no more than a row of colored dots. At the
uva 340 Master-Mind Hints
#include #include struct NUM { int x[10]; }s[2];//定义两个数组统计1-9出现的次数 int t = 1; int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int N; while((scanf("%d"
UVa:340 - Master-Mind Hints
题意:设计者设计了一组编码
UVA - 340 Master-Mind Hints
MasterMind is a game for two players. One of them, Designer, selects a secret code. The other, Breaker, tries to break it. A code is no more than a row of colored dots. At the beginning of a game, th
UVa 340:Master-Mind Hints
解题思路:首先统计位置正确的数量A,再统计正确答案和猜测中的相同数字的对数X(不用管位置),则 B=X−AB=X-A 例如: 答案为 1233553 猜测为 1133356 则有1-1、3-3、3-3、5-5、3-3五组可以配对,所以X=5,而位置正确的数量A=4,所以B=X-A=1代码如下:#include <stdio.h> #define MAXN 1005int main() {
[UVA - 340] Master-Mind Hints
MasterMind is a game for two players. One of them, Designer, selects a secret code. The other, Breaker, tries to break it. A code is no more than a row of colored dots. At the beginning of a game, the