读书人

uva340 数字匹配检索有关问题

发布时间: 2013-10-13 14:03:53 作者: rapoo

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;}}


读书人网 >编程

热点推荐