例题3-4

真是天才...
#include <iostream>
#include <fstream>
using namespace std;
const int MAXN = 100;
int inp[100];
int ans[100];
int main(void) {
	ifstream IN("IN");
	ofstream OUT("OUT");
	while (!IN.is_open() && !OUT.is_open());
	int Size;
	int Time = 0;
	while (IN >> Size) {
		if (Size == 0) break;
		for (int i = 0; i < Size; i++)
			IN >> ans[i];
		OUT << "Game " << ++Time << ":" << endl;
		while (true) {
			int Acount = 0;
			int Bcount = 0;
			for (int i = 0; i < Size; i++) {
				IN >> inp[i];
				if (inp[i] == ans[i]) Acount++; //如果与答案序列结果相同则A++
			}
			if (inp[0] == 0)
				break;

			//遍历1~9,统计每个数字在inp和ans出现的次数。
			//Bcount储存出现过但位置不对的数字的数目
			for (int i = 1; i <= 9; i++) {
				int count1 = 0, count2 = 0;
				for (int j = 0; j < Size; j++) {
					if (ans[j] == i) count1++;
					if (inp[j] == i) count2++;
				}
				//B+=较小的count,很容易理解
				//比如,我们有这样的输入数据
				//ANS 1 1 2 3 3
				//INP 2 2 1 1 1
				//则Bcount就要加2
				if (count1 < count2)
					Bcount += count1;
				else Bcount += count2;
			}
			//但事实上Bcount还并不正确,需要考虑重合的部分
			//所以我们需要使用Bcount -= Acount//Acount代表重合部分
			//想出这样的算法的真tm是个天才
			Bcount -= Acount;
			OUT << "    (" << Acount << "," << Bcount << ")" << endl;
		}
	}
	IN.close();
	OUT.close();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值