uva340 Master-Mind Hints (UVA - 340)

题目简要

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

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

例如以下的样例

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);
	}
}
posted @ 2018-10-04 10:21  baccano!  阅读(285)  评论(0编辑  收藏  举报