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;
}