1172--猜数字

原题链接


http://acm.hdu.edu.cn/showproblem.php?pid=1172
Sample Input
6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2
2
4815 0 0
2999 3 3
0

Sample Output
3585
Not sure


problem of processing


首先本题的思路一开始没有想对,想了半天之后,看了题解豁然开朗,对这种类型的题,可以sample中的n个样例看成success的n个条件,要想success,必须每个条件成立,但是只能说明这个num成立,并不能排除没有其他num成立的。因此,总体的success的条件为n个条件成立,并且仅此只有一个成立。

接下来就是如何检验俩个num数字相同并且位置相同,和只有数字相同的个数。这个没想到好办法,
只想到了n^2的时间复杂度。

总体思想,数量不大,暴力枚举


代码


#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 105;
int a[maxn], b[maxn], c[maxn];
int vis[maxn];
int n;//index表示数字位置都正确
//int cnt;//表示光数字正确
int save[maxn];

int compareIsTrue(int x, int y, int z)
{
    memset(vis,0,sizeof(vis));
    //将x转化成数组
    int index = 0;
    int cnt = 0;
    int tem = x;
    int org[5];
    int i = 0;
    while(tem)
    {
        org[i++] = tem % 10;
        tem /= 10;
    }
    //进行位置比对
    for(i=0; i<4; ++i)
    {
        if(save[i] == org[i])
        {
            index++;
        }
    }
    if(index != z)
        return 0;

    for(int j=0; j<4; ++j)
    {
        for(int k=0; k<4; ++k)
        {
            if(vis[k])
                continue;
            if(save[j] == org[k])
            {
                cnt++;
                vis[k]=1;
                break;
            }
        }
    }
    if(cnt != y)
        return 0;
    return 1;
}
int main()
{
    while(cin >> n && n)
    {
        int success = 0;
        int successNum = 0;

        for(int i=0; i<n; ++i)
        {
            cin >> a[i] >> b[i] >> c[i];
// scanf("%d%d%d",&a[i],&b[i],&c[i]);
        }

        for(int i=1000; i<10000; ++i)
        {
            bool flag = true;
            int tem = i;
            int k = 0;
            while(tem)
            {
                save[k++] = tem % 10;
                tem /= 10;
            }
            for(int j=0; j<n; ++j)
            {
                if(!compareIsTrue(a[j],b[j],c[j]))
                {
                    flag = false;
                    break;
                }
            }
            if(flag)
            {
               success++;
               successNum = i;
            }
            if(success == 2)
                break;

        }
        if(success == 1)
            cout << successNum <<endl;
        else
            cout << "Not sure" <<endl;

    }
    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 10:52
点赞 评论 收藏
分享
09-30 20:49
湖南工学院 Java
SP小夜:举报了哥,你什么都没做错,全怪我那令人作呕的嫉妒和卑微的自尊心,看见你的文字我完全破防了,我直接丢盔弃甲了,看见你这图的那一秒,我满头大汗,浑身发冷,亿郁症瞬间发作了,生活仿佛没了颜色,像是被抓住尾巴的赛亚人,带着海楼石的能力者,抽离尾兽的人柱力,像是没了光的奥特曼,彻底断绝了生的希望。我几乎都快羡慕得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。每天早上7点起床晚上9点睡觉,年复一年地学到现在,憧憬着一个月赚上万块的幸福生活,憧憬着美好阳光的未来。我打开了手机,看到你的图,我感到了深深的差距,我直接跳进了家门口的井里。
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务