uva450-sorting&searching

真是好久没怎么解题,脑袋都秀逗了。。 
 

这个是个比较有意思的题目,以前文曲星里面有这种游戏“猜数字”

一个人出一定数目的数字,比如说1 2 3 4 5

另外一个人猜,知道他不想猜了。

对于每组猜的数字,输出完全猜对的个数和只是数字正确而位置错误的数字。

比如猜1 3 6 7 8

就输出1,1

源码

#define LOCAL
#include <stdio.h>
#include <string.h>

#define MAXN 1000 + 10

int number[MAXN];
int guessNumber[MAXN];
int flags[MAXN];
int amount[10];

void match(int n);

int main()
{
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif
	int n;
	int flag;
	int t = 0;
	while(scanf("%d", &n) != EOF && n != 0)
	{
		// 数据初始化
		memset(number, 0, sizeof(number));
		memset(guessNumber, 0, sizeof(guessNumber));
		flag = false;
		// 数据输入 
		printf("Game %d:\n", ++t);
		for(int i = 0;i < n; i++)
		{
			scanf("%d", &number[i]); 
			//printf("%d", number[i]);
		}
		//printf("\n");
		
		while(true)
		{
			flag = true;
			for(int i = 0;i < n; i++)
			{
				scanf("%d", &guessNumber[i]);
				//printf("%d", guessNumber[i]);
				if(guessNumber[i] != 0)
				{
					flag = false;
				}
			}
			//printf("\n");
			if(flag == true)
			{
				break;
			}
			// 算法主体
			match(n);
		}
	
		
	}
	return 0;
}

void match(int n)
{
	memset(flags, 0, sizeof(flags));
	memset(amount, 0, sizeof(amount));
	int r = 0;
	int s = 0;
	for(int i = 0; i < n; i++)
	{
		if(number[i] == guessNumber[i])
		{
			r++;
			flags[i] = true;
		}
		else
		{
			amount[number[i]]++;
		}
	}
	
	for(int i = 0; i < n; i++)
	{
		if(flags[i] == false)// 猜测的数字未被使用 
		{
			if(amount[guessNumber[i]] > 0)
			{
				s++;
				amount[guessNumber[i]]--;
			}
		}
	}
	
	printf("    (%d,%d)\n", r, s);
}


你可能感兴趣的:(uva450-sorting&searching)