这道题目大意是:给定一个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; } }