CF753B题解

这应该算是一个很脍炙人口的小游戏了吧 (没玩过算我没说)

因为一共有 \(50\) 次询问机会,那最简单直接的方法就不难想到。

我们把 \(0 \sim9\) 全部询问一遍,如果回答两个整数不全为 \(0\),说明答案数字里有这个数码,然后我们把这个数记下来。这就用了\(10\)次。

然后我们把这四个数的所有排列全部询问一遍,如果得到 \(4,0\) 的回答就直接结束。最多需要 \(4!=24\) 次,所以一共最坏只需要 \(34\) 次完全没问题。

反正我小时候3次就猜出来了

小坑点:在第一遍询问0的时候要输出0000的字符串不能直接输出0!!!

 

#include<bits/stdc++.h>

using namespace std;

bool use[10];

int main()
{
    int a[10];
    memset(use, 1, sizeof(use));
    int cnt = 0;
    for(int i = 0; i <= 9; i++)//0~9全部询问
    {
        if(i != 0)
            cout << i * 1000 + i * 100 + i * 10 + i << endl;
        else
            cout << "0000" << endl;//这里要输出字符串
        int A, b;
        cin >> A >> b;
        if(A || b) //记录出现过的数字
            a[++cnt] = i, use[i] = 0;
    }
    int c, d;
    for(int i = 1; i <= cnt; i++)//暴力全排列
        for(int j = 1; j <= cnt; j++)
            for(int k = 1; k <= cnt; k++)
                for(int l = 1; l <= cnt; l++)
                {
                    if(i == j || i == k || i == l || j == k || j == l || k == l)
                        continue;
                    cout << a[i] << a[j] << a[k] << a[l] << endl;
                    int c, d;
                    cin >> c >> d;
                    if(c == 4)
                        return 0;
                }
    system("pause");
    return 0;
}
posted @ 2020-12-23 22:47  Starry___sky  阅读(75)  评论(0编辑  收藏  举报
Live2D