Childhood dream
比赛链接
题目链接:Childhood dream
题目描述:
你童年时期就有一个梦想,想要加入 ACM(Association of Calculation and Magic),今天,这个机会终于 来了。
但是 ACM 只想要哪些天赋异禀的人, 比如像 tourist,他们给了你一道题来检测你是否足够机智。
猜一个长度为 m 数字串,总共有 n 个提示串,解释如下:
8640 0A2B
A 前面的数字说明与答案相比,有多少个位置上的数字是相同的。 B 前面的数字说明与答案相比,有多 少个数字是相同的,但是位置不一样。
0 A 就表示给出的串没有任何位置和答案是相同的。 2 B 就表示给出的串中有两个数字和答案相同,但 是位置不一样。
所以,对于上面那个提示串 6457 是一个合理的答案,但是 1234 并不是。
现在给你 N(N<=100) 个提示串(如上所示),你需要去找到一个数字串来符合每一个提示串的要求。
提示串中的每个数字都是不同的,即一个串中不会存在相同的数字。
你能解决这个问题并加入 ACM 吗?
输入
第一行两个数字,n(n<=100) 和 m(m<=9), 提示串的数量以及目标字符串的长度。
然后是 n 行,每行的格式如下:
s x y
s 是提示串,x 是 A 前的数字,y 是 B 前的数字,等同于:
s xAyB
输出
一行,目标串。
数据保证答案唯一。
样例输入
6 4
5164 3 0
5174 3 0
5194 3 0
5124 3 0
5134 3 0
5104 3 0
样例输出
5184
题意分析
这道题的意思就是猜一个数,数的位数是确定的,然后会进行猜数,会给出两个数,第一个数代表位置相等且大小相等的个数,第二个数代表的是数相等但位置不等的数,通过这几次猜测,让你输出对应的满足条件的答案。因为答案最大的长度才10所以可以直接全排,全排之后对每次猜测就行A跟B的计算,然后跟输入进行比较,最后根据比较的结果得出答案,题目保证答案唯一。这样想这道题还是很水的。。。
代码实现

#include<bits/stdc++.h>
using namespace std;
string s[105];
int a[105],b[105];
int A[10]={0,1,2,3,4,5,6,7,8,9};
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>s[i]>>a[i]>>b[i];
    do
    {
        bool flag=0;
        int x,y;
        for(int i=0;i<n;i++)
        {
            x=y=0;
            for(int j=0;j<m;j++)
            {
                if(A[j]==s[i][j]-'0')
                {
                    x++;
                }
            }
            for(int j=0;j<m;j++)
                for(int k=0;k<m;k++)
                {
                    if(j!=k&&A[j]==s[i][k]-'0')
                        y++;    
                }
            if(x!=a[i]||y!=b[i])
            {
                flag=1;
                break;
            }
        }
        if(!flag)
        {
            for(int i=0;i<m;i++)
            {
                cout<<A[i];
            }
            cout<<endl;
            break;
        }
    }while(next_permutation(A,A+10));
    return 0;
}

全排之后取前m位进行判断就行。
虽说题有点‘水’,但要是让我自己做出来显然还是不可以的,加油吧!

附上学霸学长修改了的我的TLE的代码,我又学到了好多东西🎈

#include<bits/stdc++.h>
using namespace std;
int a[10]={0,1,2,3,4,5,6,7,8,9};
struct guess
{
    string S;
    int A,B;
}gue[100];
int n,m,x,y;
bool check()
{
    int k,l;
    for(int i=0;i<n;i++)
    {
        k=l=0;
        for(int j=0;j<m;j++)
        {
            if(a[j]==gue[i].S[j]-'0')
                k++;
        }
        for(int k=0;k<m;k++)
            for(int j=0;j<m;j++)
            {
                if(k==j)
                    continue;
                if(a[k]==gue[i].S[j]-'0')
                    l++;
            }
        if(k!=gue[i].A||l!=gue[i].B)
            return 0;
    }
    return 1;
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>gue[i].S>>gue[i].A>>gue[i].B;
    do
    {
        if(check())
        {
            for(int i=0;i<m;i++)
                cout<<a[i];
            cout<<endl;
            break;
        }
    }while(next_permutation(a,a+10));
    return 0;
}