uva340 Master-Mind Hints (UVA - 340)

本文详细解析了一种猜数字游戏的算法实现,通过对比原题目和猜测答案,判断位置和数值是否匹配,采用双for循环和标记数组确保数据只被使用一次,最终输出匹配结果。

题目简要

题目意思很简单每个测试都由原题目在第一行,然后后面的都是去猜的答案,如果猜测的位置正确那么输出的结果的数对里面的第一个数就加一,如果仅答案正确(原题目里有这个数,但是位置不一样)那么就在输出数对的第二个数加一。

并且需要注意已经判断过的数是不能再判断第二次的。

例如以下的样例

1 3 5 5
1 1 2 3
4 3 3 5

1 3 5 5是原来的题目,对于1 1 2 3来说只有第一个1是位置正确并且答案也对的,那么经过计算后原题目的1和现在猜测的1都去掉然后变成了 3 5 5 和1 2 3然后发现还有一个最后的3是答案正确但是位置不对,所以第一个输出的数对是(1,1)以此类推第二个是猜测的第二个数3和第四个数5满足第一个条件所以输出的答案是(2,0)

如何实现

首先第一个条件很好判断啊,直接把原来的题目和输出的答案进行对照就行了。

第二个条件可能难一点,我的想法也是直接判断,写两个for然后外面for是代表原题目的每个数,里面的for是答案的每个数一一对应如果有一样的,那么第二个条件加一

对于去除数据来说我的想法是直接开两个bk就行了,bk是1的时候说明这个数已经用过了,每次先判断一下bk就行了。

然后就是注意先判断第一个条件 还有的就是注意输出格式。

我的代码

#include <iostream>
#include <cstring>
//#include "fp.h"
using namespace std;
int num[1100];
int num2[1100];
int bk1[1100];
int bk2[1100];
struct node
{
    int x,y;
}p[1100];
main()
{
    //fop();
    int n;
    int nnum=0;
    while(cin>>n&&n)
    {
        for(int i=0;i<n;i++)
        scanf("%d",&num[i]);
        int jk=0;
        while(1)
        {
            int ans1,ans2;
            ans1=ans2=0;
            memset(bk1,0,sizeof(bk1));
            memset(bk2,0,sizeof(bk2));
            for(int j=0;j<n;j++)
            scanf("%d",&num2[j]);
            if(num2[0]==0)
            break;
            for(int j=0;j<n;j++)
            if(num[j]==num2[j])
            {
                ans1++;bk1[j]=bk2[j]=1;
            }
            for(int j=0;j<n;j++)
            for(int k=0;k<n;k++)
            if(!bk1[j]&&!bk2[k])
            {
                if(num[j]==num2[k])
                {
                    ans2++;bk1[j]=bk2[k]=1;
                }
            }
            //cout<<ans1<<" "<<ans2<<endl;
            p[jk].x=ans1;p[jk].y=ans2;
            //cout<<p[jk].x<<" "<<p[jk].y<<endl;
            jk++;
        }
        printf("Game %d:\n",++nnum);
        for(int j=0;j<jk;j++)
        printf("    (%d,%d)\n",p[j].x,p[j].y);
    }
}

转载于:https://www.cnblogs.com/baccano-acmer/p/9741688.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值