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

原题链接https://vjudge.net/problem/UVA-340
分类:数组
备注:思维、英语

题意:给若干组游戏,每组第一行输入一个N,如果N为0表示程序结束。第二行是N个数为本次游戏的正确答案。接下来的每一行也是N个数表示挑战者作答的答案,当挑战者输入0时表示本次游戏结束。要求输出每次作答时,有多少数字位置正确,有多少数字都出现过但位置不正确(两方都出现的数是能一一配对的,如果有多余的不算,如果答案正确的也不算)

思路:一定要看懂题目。我直接用两个数组分别标记标准答案数组和作答答案数组已经配对过的元素。但是作者的方法更好,更有技巧,将有多少是正确对位的算出,再将都出现过的算出,后者减去前者为出现过但位置不正确的。
代码如下:

#include<stdio.h>
const int maxn = 1000 + 5;
int N, a[maxn], b[maxn], kase;
int main(void)
{
	while (~scanf("%d", &N) && N)
	{
		printf("Game %d:\n", ++kase);
		for (int i = 0; i < N; i++)
			scanf("%d", &a[i]);
		while (1)
		{
			int cnt1 = 0, cnt2 = 0;
			int flag1[maxn] = { 0 }, flag2[maxn] = { 0 };
			for (int i = 0; i < N; i++)
			{
				scanf("%d", &b[i]);
				if (a[i] == b[i])
				{
					flag1[i] = flag2[i] = 1;
					cnt1++;
				}
			}
			if (!b[0])break;
			for (int i = 0; i < N; i++)
				if (!flag2[i])
					for (int j = 0; j < N; j++)
						if (!flag1[j] && b[i] == a[j])
						{
							flag1[j] = 1;
							cnt2++;
							break;
						}
			printf("    (%d,%d)\n", cnt1, cnt2);
		}
	}
	return 0;
}

作者思路:

#include<stdio.h>
const int maxn = 1000 + 5;
int N, a[maxn], b[maxn], kase;
int main(void)
{
	while (~scanf("%d", &N) && N)
	{
		printf("Game %d:\n", ++kase);
		for (int i = 0; i < N; i++)
			scanf("%d", &a[i]);
		while (1)
		{
			int cnt1 = 0, cnt2 = 0;
			for (int i = 0; i < N; i++)
			{
				scanf("%d", &b[i]);
				if (a[i] == b[i])
					cnt1++;
			}
			if (!b[0])break;
			for (int i = 1; i <= 9; i++)
			{
				int c1 = 0, c2 = 0;
				for (int j = 0; j < N; j++)
				{
					if (a[j] == i)c1++;
					if (b[j] == i)c2++;
				}
				cnt2 += (c1 > c2 ? c2 : c1);
			}
			cnt2 -= cnt1;
			printf("    (%d,%d)\n", cnt1, cnt2);//4个空格
		}
	}
	return 0;
}
发布了22 篇原创文章 · 获赞 23 · 访问量 517

猜你喜欢

转载自blog.csdn.net/TK_wang_/article/details/104351327
今日推荐