UVa - 340 - Master-Mind Hints

题目传送门

/*
	这道题的大意是:
	先在第一行输入接下来每行的数字的个数(n)
	第二行是一个用来和之后序列做比较的一个序列——即接下来的序列都是和他比较
	后面的任意多行都要和第二行做比较,直到碰到全都是0的序列为止
	(但是题目说序列中只会出现1-9,所以只要第一个数字是0,我们就可以认为结束了。)
	然后再次输入每行数字的个数,直到你输入0为止。
	比较规则:
	前一个输出的数字是基准序列和需比较序列在相同的位置有相同数字的数字的个数
	后一个输出的数字是两个序列都出现过但位置不相同的数字的个数
*/
#include <iostream>
#include <stdio.h>
#define MAXN 1010//序列的最大长度
using namespace std;
int answer[MAXN];//基准序列
int match[MAXN];//各个比较序列
int temp[MAXN];//基准序列的副本,因为需要对这个副本的值进行操作
int main(void)
{
	int n, k = 1;//k是为了控制格式

	while (scanf_s("%d", &n) != EOF && n)//n为0时结束
	{
		printf("Game %d:\n", k++);//格式需要
		for (int i = 0; i < n; i++)
			scanf_s("%d", &answer[i]);//基准序列的输入
		while (true)
		{
			int a = 0, b = 0;//a和b分别是两种情况的次数

			for (int i = 0; i < n; i++)
				temp[i] = answer[i];//建立副本后,temp的值可以随意更改
			for (int i = 0; i < n; i++)
				scanf_s("%d", &match[i]);//输入当前需比较的序列
			if (!match[0])
				break;//如果比较序列的第一个值为0,我们就认为每一个值都是0
			for (int i = 0; i < n; i++)
				if (match[i] == temp[i])
				{//对应位置相同
					match[i] = temp[i] = 0;//这里要记得把这两个处理过的数据消除掉——化为0
					a++;
				}
			for (int i = 0; i < n; i++)
			{//两个序列都出现过,但位置不同。这里需要注意的是,之前因对应位置相同消去的数据是不需要重复计算的
				if (match[i])//如果需比较序列为非零数字
					for (int j = 0; j < n; j++)//就和基准序列的每一个数比较
						if (match[i] == temp[j])
						{
							b++;//如果基准序列中出现一个和当前需比较数据相同的值
							match[i] = temp[j] = 0;//两个位置同时清楚——化为0
							break;//并且退出当前循环
						}
			}
			printf("    (%d,%d)\n", a, b);//按照格式输出,之前有四个空格
		}
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值