算法习题---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);
        }

    }
}

原文地址:https://www.cnblogs.com/ssyfj/p/10806860.html

时间: 2024-10-31 03:08:55

算法习题---3.01猜数字游戏提示的相关文章

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

[本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] Question 例题3-4 猜数字游戏的提示(Master-Mind Hints,UVa340) 实现一个经典的"猜数字"游戏.给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据.每组输入第一行为序列长度 n,第二行是答案序列,接下来若干行猜测序列.猜测序列全0 时该组数据结束. n=0时输入结束. Example Inp

UVa 340 Master-Mind Hints(猜数字游戏的提示)

题意  猜数字游戏  统计猜的数字有多少个数字位置正确  有多少个数字在答案中出现但是位置不正确  每个字符只能匹配一次 直接匹配每位数 #include<cstdio> #include<algorithm> #include<map> using namespace std; const int N = 1005; int a[N], b[N], c, d; int main() { int n, cas = 0; while (scanf ("%d&qu

例题3_4 猜数字游戏的提示(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

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

题目: 实现一个经典"猜数字"游戏. 给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据. 每组输入第一行为序列长度n,第二行是答案序列,接下来是若干猜测序列. 猜测序列全0时该组数据结束. n=0时输入结束. 样例输入:4 13 5 51 1 2 34 3 3 56 5 5 16 1 3 51 3 5 50 0 0 0101 2 2 2 4 5 6 6 6 91 2 3 4 5 6 7 8 9 11 1 2 2

java web 程序---猜数字游戏

思路:1.第一个是随机产生的数字,告诉我们去猜  cai.jsp 2.第二个是一个form表单,提交按钮后,将连接到验证页面 test1.jsp 3.第三个是比较猜的数和随机数.对了,提示再玩一次,不对则继续猜.用一个超链接 test2.jsp 老师的思路越来越难搞了.怎么写啊,用到hashMap时候 cai.jsp ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <%@ page lang

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文

原创Android游戏--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

--------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添加的功能,以及一些可改进的地方,于是准备继续完善此游戏,顺便学Android了. 本次更新信息如下: 1.改正了随机数生成算法,更正了不能产生数字'9'的bug 2.增加了数据存储与IO的内容,使用了SharedPreferences保存数据 3.保存数据为: 总盘数,猜中的盘数 4.使用了Simp

Python实现简单的猜数字游戏

Python实现简单的猜数字游戏,具体如下: 随机生成一个1-10之间的数字,让用户来猜,当猜错时,会提示猜的数字是大还是小了,直到用户猜对为止. import random secret = random.randint(1,10) #print(secret) print('------猜数字游戏!-----') guess = 0 while guess != secret: temp = input('猜数字游戏开始,请输入数字:') guess = int(temp) if guess

猜数字游戏代码

#include <iostream> #include <cstdlib> #include <conio.h> #include <ctime> using namespace std; //清屏 void ClearScreen() { system("cls"); } //显示菜单 void ViewMenu() { cout<<"******************"<<endl; c