zoukankan      html  css  js  c++  java
  • 算法习题---3.01猜数字游戏提示(UVa340)

     一.题目

    实现一个经典“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(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:
    ", ++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)
    ", Count_A, Count_B);
            }
    
        }
    }



  • 相关阅读:
    NYOJ 205
    NYOJ 187
    NYOJ 105
    NUOJ 88
    NYOJ 70
    LL(1)算法
    MATLAB的一些基础知识
    Ubuntu raid5+lvm实验
    空间滤波
    认识weblogic的各个机构
  • 原文地址:https://www.cnblogs.com/ssyfj/p/10806860.html
Copyright © 2011-2022 走看看