算法习题---3.01猜数字游戏提示

Posted ssyfj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法习题---3.01猜数字游戏提示相关的知识,希望对你有一定的参考价值。

 一.题目

实现一个经典“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B)。 
输入包含多组数据。每组输入第一行为序列长度n,第二行是答案序列,接下来是若干猜测序列,猜测序列全0时该组数据结束。n=0时输入结束。 

二:样例输入:

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         //结束符

三:样例输出 

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

实际效果:

Game 1:
输入答案序列
输入猜测序列
输出样例结果---(1,1) 
输入猜测序列
输出样例结果---(2,0) 
输入猜测序列
输出样例结果---(1,2) 
输入猜测序列
输出样例结果---(1,2) 
输入猜测序列
输出样例结果---(4,0) 

技术图片

四:重点分析--有多少数字在两个序列都出现过但位置不对(B)

实际就是将答案序列和猜测序列中满足数字位置正确的地方去除。
然后对剩余的进行比较数字是否在两个序列中存在且位置不对(一定不对,对的已经删除了)
例:
1 3 5 5
6 5 5 1
--------将相同的位置去除,即第三列 数目为1
1 3 5
6 5 1
-------查看满足数字同时处于两个序列的数字
1 5都在,且位置不对,所以数目为2
例:
1 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
---------------------将相同位置去除,即第1,2列---数目为2
2 2 4 5 6 6 6 9
3 4 5 6 7 8 9 1
---------------------查看满足数字同时处于两个序列的数字
4 5 6 9都在且位置不对---所以数目为4

1.额外声明数组记录下正确序列C和猜测序列D

技术图片

技术图片

2.统计数据正确的个数的同时---将对应CD数组对应位置减一

 技术图片

3.将CD数组进行比较,只有C[i]和D[i]同时存在,才认为这个数字在两个序列存在单位置不对

技术图片

五:代码实现

#define MAX_N 1010

void test22()
{
    //猜数字游戏
    int n;    //列数
    int A[MAX_N], B[MAX_N];    //记录序列
    int C[10],D[10],T[10];    //用于去重
    int Count = 0;    //记录游戏次数
    int jd;    //判断是否结束
    int Count_A, Count_B;    //记录正确和出现的数据

    while (1)
    {
        //输出游戏
        printf("Game %d:\\n", ++Count);

        //1.进行输入,存储信息
        scanf("%d", &n);
        if (n == 0)
            break;

        memset(C, 0, sizeof(C));

        //输入正确序列到A
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &A[i]);
            C[A[i]]++;
        }

        //输入猜测序列B
        while (1)
        {
            memset(D, 0, sizeof(D));
            memcpy(T, C, sizeof(C));
            jd = 0;
            for (int i = 0; i < n; i++)
            {
                scanf("%d", &B[i]);
                if (B[i] != 0)
                    jd = 1;
                D[B[i]]++;
            }
            if (jd == 0)
                break;

            //2.进行判断
            Count_A = Count_B = 0;
            for (int i = 0; i < n; i++)
                if (A[i] == B[i])
                {
                    Count_A++;
                    T[A[i]]--;
                    D[B[i]]--;
                }

            for (int i = 0; i <= 9; i++)
                if (T[i]&&D[i])
                    Count_B++;

            //3.进行输出信息
            printf("    (%d,%d)\\n", Count_A, Count_B);
        }

    }
}

技术图片

 

以上是关于算法习题---3.01猜数字游戏提示的主要内容,如果未能解决你的问题,请参考以下文章

JAVA面向对象练习题

练习题 --- 猜数字游戏

C语言 猜数字游戏代码

使用C语言编写猜数字问题

一道Shell编程趣味练习题,看你会不会?

猜数字游戏的提示(Master-Mind Hints,UVa340)