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;

	}

}


 

 

你可能感兴趣的:(uva)