枚举HDU-1172猜数字

http://acm.hdu.edu.cn/showproblem.php?pid=1172

题意:

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

多组输入数据,第一行表示共有N(N<=100),次问答,每行三个整数A,B,C,猜这个四位数为A,猜对了B个数字,C个在正确位置上。N=0时输入结束。

题解:

  从正面分析的话,无从下手,然后数据范围只有100,且四位数的话总共也就只有10^4,直接枚举即可

  枚举的判决条件与所猜数字无关。

代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iomanip>

using namespace std;
const int maxn=110;
typedef long long ll;

int n;
int a[maxn],b[maxn],c[maxn];
int num;
int ans;

int check(int x,int y)
{
  //4位数x是否符合第y次问答的结果
  int s[4],t[4],pa=a[y],pb=b[y],pc=c[y];
  for(int i=3; i>=0; i--)
  {
    s[i]=x%10,x/=10,t[i]=pa%10,pa/=10;
  }

  int correct_num=0,correct_pos=0;
  for(int i=0; i<4; i++)
  {
    if(s[i]==t[i]) correct_pos++;
  }
  for(int i=0; i<4; i++)
   for(int j=0; j<4; j++)
    if(t[j]==s[i])
    {
      correct_num++;
      t[j]=-1;
      break;
    }
    return correct_num==pb&&correct_pos==pc;
}

int main()
{
  while(cin>>n&&n)
  {
    for(int i=0; i<n; i++) 
     cin>>a[i]>>b[i]>>c[i];
    num=0;

    for(int i=1000; i<10000&&num<2; i++)
    {
      int j=0;
      for(; j<n; j++) if(!check(i,j)) break;
      if(j==n) num++,ans=i;//满足所有问答的结果
    }

    if(num==1) cout<<ans<<endl;
    else cout<<"Not sure"<<endl;
  }
  system("pause");
  return 0;
}

 

posted on 2021-01-16 20:45  mmn  阅读(148)  评论(0)    收藏  举报