uva340 数字匹配检索问题

这道题目大意是:给定一个secret code,然后输入guess code,让你编程给出提示,提示的格式是(i,j),其中i表示strong match的个数,j表示weak match的个数。所谓strong&weak match就有一点像猜数字游戏了,strong match表示数字正确且位置也正确;weak match表示数字正确但位置不正确。要求每输入一个guess code就要输出相应的hint。

我的思路是先循环一次将所有strong match找出,再建立一个存下表的数组,将不是strong match的下标加入该数组中,方便之后寻找weak match。因为题目要求hint必须满足总匹配数和strong 匹配数都达到最大,所以有strong match 的情况就不要将它归到weak match里边了。之后找weak match就简单了,将secret code数组未匹配的位置遍历一遍,统计出1-9这九个数字各出现几次,再统计guess code数组,然后每一个数字取出现次数少的即为该数字的weak match的次数(e.g.1在secret code出现了2次,在guess code出现了一次,则weak 匹配数必然=1,同理将2,3……9都求出来相加即为结果)

代码如下

#include<iostream>
using namespace std;
int main()
{
	int n;
	int col=0;
	while(cin>>n&&n!=0)
	{
		col++;
		int* scode=new int[n];
		for (int i=0;i<n;i++) cin>>scode[i];
		cout<<"Game "<<col<<":"<<endl;
		while (1)
		{
			int strong,weak;
			strong=weak=0;
			int* gcode=new int[n];
			for (int i=0;i<n;i++) cin>>gcode[i];
			if (gcode[0]==0) 
			{
				delete gcode;
				break;
			}
			int* unmatch=new int[n];
			int index_unmatch=0;
			for (int i=0;i<n;i++)
			{
				if (scode[i]==gcode[i]) strong++;
				else
				{
					unmatch[index_unmatch++]=i;
				}
			}
			if (index_unmatch>0)
			{
				int scount[10]={0};
				int gcount[10]={0};
				for (int i=0;i<index_unmatch;i++)
				{
					scount[scode[unmatch[i]]]++;	//scount[1]存放的即1在scode中出现次数
					gcount[gcode[unmatch[i]]]++;
				}
				for (int i=1;i<10;i++)
				{
					weak=weak+(scount[i]<gcount[i]?scount[i]:gcount[i]);	//取小的数
				}
			}
			
			cout<<"    ("<<strong<<","<<weak<<")"<<endl;
			delete unmatch;
			delete gcode;
		}
		delete scode;
	}
}


你可能感兴趣的:(C++,搜索,ACM,uva)