zoukankan      html  css  js  c++  java
  • HDU 1172 猜数字

    猜数字

    题意:

    计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。

    注意

    • 多组输入
    • 答案唯一,假如有多个答案,输出“Not sure”
    • 难点在如何判断 计算机回答猜对了B个数字
    • 例如 计算机输入 1234 猜对了3个数字,正确的答案是 1115
      • 意思是 答案中存在 三个 1 ,即计算机只需要猜对有几个数字就行,每个数都能在答案中猜出全部的个数
    • 例如 计算机输入 1112 猜对了 1个数字,正确的答案是 1236
      • 意思是 计算机猜的 1 的个数是看答案中 有几个 1,与计算机输入的猜测 无关。
    思路

    因为题目的数据范围很小,答案只存在于 ([1000,9999]) 这个区间,所以可以枚举该区间内的数,

    针对每个数,判断其是否满足全部的条件,如果全部满足,那么这个数字就是答案。

    #include <bits/stdc++.h>
    using namespace std;
    #define endl '
    '
    const int N = 110;
    struct node {// a 是计算机猜测的数字,b是猜对了的数字,c是在正确位置上的数字
        int a,b,c;
    }num[N];
    int n,x[4],y[4],st[4];
    bool check(int num_x) {// 判断函数
        for(int i = 0;i < 4; ++i) {// 假设成立的数字 num_x ,分解到 x 数组中
            x[i] = num_x % 10;
            num_x /= 10;
        }
        for(int i = 0;i < n; ++i) {// 共有 n 个测试样例
            int bb = 0,cc = 0,t;// bb是该组输入数据中猜对了的数字,cc是在正确位置上的数字
            memset(st,0,sizeof st);// 每次都要初始化一遍 st数组,用来判断是否重复统计
            t = num[i].a;
            for(int j = 0;j < 4; ++j) {// 分解 num[i].a ,并判断 cc 的个数
                y[j] = t % 10;
                t /= 10;
                if(x[j] == y[j]) cc ++;
            }
            if(num[i].c != cc) return 0;// 如果 cc 不等于 c,就返回 0
            for(int j = 0;j < 4; ++j) {// 用 x数组 来扫描 y数组
                for(int k = 0;k < 4; ++k) {
                    if(x[j] == y[k] && st[k] == 0) {// 如果 x 数组中的元素 跟 y数组中的元素相等,且 y数组中的元素没用被统计过
                        bb ++;// 猜出的数字,代表 y 中的数猜对了 x 中的数
                        st[k] = 1;// 把 y 数组中的第 k 个数字删掉。
                        break;// 每次只能猜出一个数字,防止 y 中多个重复的数字。
                    }
                }
            }
            if(num[i].b != bb) return 0;// 如果 bb 不等于 b 返回 0
        }
        return 1;//如果满足全部条件,返回 1
    }
    int main() {
        ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
        while(cin >> n && n) {
            int cnt = 0,ans = 0;
            for(int i = 0;i < n; ++i) cin >> num[i].a >> num[i].b >> num[i].c;
            for(int i = 1000;i < 10000; ++i) {
                if(check(i)) {
                    cnt ++;//记录满足的答案个数
                    ans = i;//记录 答案
                    if(cnt > 1) break;//如果答案大于 1 个,就说明无解。
                }
            }
            if(cnt == 1) cout << ans << endl;
            else cout << "Not sure" << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    第二十九课 循环链表的实现
    第二十八课 再论智能指针(下)
    第二十七课 再论智能指针(上)
    第二十六课 典型问题分析(Bugfix)
    普通new和placement new的重载
    leetcode 581. Shortest Unsorted Continuous Subarray
    leetcode 605. Can Place Flowers
    leetcode 219. Contains Duplicate II
    leetcode 283. Move Zeroes
    leetcode 217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/lukelmouse/p/12298863.html
Copyright © 2011-2022 走看看