题意:交互式题目,猜数字的游戏。一方想一个四位数(每一位数字都不同),另一方每次猜一个四位数,该方回复一个两位数,第一位代表有多少个数字完全正确,第二位代表有多少个数字位置不正确但是包含在正确的四位数里,求不少于8次的猜法
分析:暴力。先存好所有的四位不同的数,然后随便选一个猜,得到回复后,在存好的数里所有满足这个回复的四位数中随机选择一个作为下一次要猜的数,再次得到回复之后,再在存好的数里面找满足前两个条件的所有的四位数,以此类推。。
代码:
#include<bits/stdc++.h>
using namespace std;
vector<string>vec1;
vector<string>res;
vector<pair<string,string> >tri;
void init()
{
string t;
set<int>st;
for(int i = 0; i < 10000; i++)
{
int x = i;
t.clear();
st.clear();
for(int j = 0; j < 4; j++)
{
t.push_back(x % 10 + '0');
st.insert(x % 10);
x /= 10;
}
if(st.size() == 4)
{
vec1.push_back(t);
//cout<<t<<endl;
}
}
}
string compare(string a,string b)
{
string ans = "00";
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
if(a[i] == b[j])
{
if(i == j)
ans[0]++;
else
ans[1]++;
}
}
}
return ans;
}
string work()
{
//cout<<(int)vec1.size()<<endl;
res.clear();
for(int i = 0; i < (int)vec1.size(); i++)
{
bool ok = true;
for(int j = 0; j < (int)tri.size(); j++)
{
//cout<<tri[j].second<<endl;
if(compare(vec1[i],tri[j].first) != tri[j].second)
{
ok = false;
break;
}
}
if(ok)res.push_back(vec1[i]);
}
//cout<<(int)res.size()<<endl;
return res[rand() % res.size()] ;
}
int main()
{
init();
string t = "0123";
string s;
while(1)
{
cout<<t<<endl;
fflush(stdout);
cin>>s;
if(s == "40")break;
tri.push_back({t,s});
t = work();
}
return 0;
}