CF63C Bulls and Cows题解
xiaobai0123
·
·
题解
题目传送门
题意
$B$ 一共猜了 $n$ 次($n \le 10$),问 $B$ 是否能猜出正确的数并输出,如果没有这样的数输出 `Incorrect data` 有多解输出 `Need more data`,有唯一解输出答案。
## 思路
按照数学的方法我不知道有没有(~~我这个蒟蒻只会暴力出奇迹~~)
首先,题目说了答案是 $4$ 位数,这就让我这个蒟蒻有了希望!我们枚举 $1000$ ~ $9999$ 所有的数,然后看在这些数里有几个满足输入条件的,如果我们用`ans`来记录一共有几个数满足条件。那么就有以下情况:
1. $ans=0$ 那么没有答案,输出`Incorrect data`
2. $ans=1$ 那么有且只有一个答案,输出答案
3. $ans>1$ 那么有很多答案,输出`Need more data`
## 你们最喜欢的AC代码
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,a,b,c,num[10000],True,ans=0,cnt=0;
int v[10000];//记录遍历的数字j符合的次数
int main(){
cin>>n;
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
memset(num,0,sizeof(num));
num[a%10]=num[(a/10)%10]=num[(a/100)%10]=num[a/1000]=1;//每一组猜词的每一个数字的数组记为1
for(int j=100;j<=9999;j++){
int sum=num[j%10]+num[(j/10)%10]+num[(j/100)%10]+num[j/1000];
int p=j%10,q=(j/10)%10,r=(j/100)%10,s=j/1000;//将每一个数字拆开
if(p==q||p==r||p==s||q==r||q==s||r==s)continue;//保证每个数不重复
True=0;//位置正确的数
if(p==a%10) True++;
if(q==(a/10)%10)True++;
if(r==(a/100)%10)True++;
if(s==a/1000)True++;//位置正确True++
if(True==b&&sum-True==c)v[j]++;//如果个数和 b、c对应 ,则v[]++;
}
}
for(int i=1000;i<=9999;i++){
if(v[i]==n){//v[]与n相等时 cnt++,表示满足几个猜的数的答案的个数
cnt++;ans=i;
}
}
if(cnt==1)cout<<ans/1000<<(ans/100)%10<<(ans/10)%10<<ans%10;//满足的答案唯一,即为正确
else if(cnt>1)cout<<"Need more data";//答案不唯一,则缺少数据
else cout<<"Incorrect data";//无答案,则存在错误
return 0;
}
```