340 - Master-Mind Hints

Problem.png

题目描述比较复杂,简单来说就是给一行答案序列,再给一行猜测序列,统计有多少数字是恰好对位匹配的(Strong Match, A),有多少数字是两行里都有但是位置不同的(Weak Match, B)。
A的数目可以直接遍历一遍统计,而B的数目则需要对1-9每一个数,分别统计它们在答案序列和猜测序列里各出现多少次,取较小的那个值加给B。
之所以取较小的值,是因为假设答案行有3个1,猜测行有5个1,那么总共一定有3个1是在两行都出现的,因此要加给B。
这之后还要从B里减去A的值,即去掉同时在两行里出现又是对位匹配的数的个数,剩下的就是错位的数的个数。

#include <iostream>

using namespace std;

#define MAXN 1010

int main() {
    int n, game = 0;
    int answer[MAXN], guess[MAXN];
    while (cin >> n && n) {
        cout << "Game " << ++game << ":" << endl;
        for (int i = 0; i < n; i++) {
            cin >> answer[i];
        }
        while (1) {
            int A = 0, B = 0;
            for (int i = 0; i < n; i++) {
                cin >> guess[i];
                // 直接统计A的个数
                if (guess[i] == answer[i]) A++;
            }

            // 正常的猜测序列不会有0,故第一位为0即可退出
            if (guess[0] == 0) break;

            // 对每个数字,统计它在答案序列和猜测序列中各出现了多少次
            // 把较小的值加给B(注意思考为何取较小值)
            for (int d = 1; d <= 9; d++) {
                int sum_ans = 0, sum_gue = 0;
                for (int j = 0; j < n; j++) {
                    if (answer[j] == d) sum_ans++;
                    if (guess[j] == d) sum_gue++;
                }
                if (sum_ans < sum_gue)
                    B += sum_ans;
                else
                    B += sum_gue;
            }
            // 再减去A的部分就是B的正确值
            B -= A;
            cout << "    (" << A << "," << B << ")" << endl;
        }
    }
}

还需要注意一点

while (cin >> n && n)

cin >> n返回的也是一个cin对象,当一个cin对象作为条件选择、循环等的控制表达式时,编译器会将其转换为真值表达式,如果cin的iostate为goodbit,则这个真值表达式的结果为真,否则为假。
输入一个非数字可以置位failbit,从而结束循环,当然这是一个非正常退出。
正常退出可以用键盘模拟产生EOF,表示流输入结束了。在windows中可以输入ctrl+z,unix/linux中则为ctrl+d。

因此当n = 0来结束输入时,cin >> n仍然会返回真值,故必须要加上 && n。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,186评论 6 13
  • 第一章 计算机与C++编程简介 C++程序6个阶段编程 ->预处理->编译->连接->装入->执行1.程序在编译器...
    rogertan30阅读 4,116评论 0 1
  • 作业 作业感想 这次作业的难度是有的,在画的过程中会出现一些问题,大都是事先没有观察好就画所导致的,人物比例也处理...
    Denovo_45bd阅读 246评论 1 1
  • 忽然之间,心中涌出了买醉的念头,怎么都挥散不去。我不爱喝酒,只是刚才在听歌的时候,好像又回到了三年前的那个夜晚,想...
    三品茗阅读 933评论 0 6
  • 主要步骤: 设置二维码相关配置,包括传入的二维码长宽、容错率和空白边距大小 将配置参数传入到QRCodeWrite...
    浮名虚誉架构师阅读 395评论 0 0