• 例题3-4 master-mind hints


    下面先附上我的水货代码,,,,一会附上,,,刘大婶给的代码///////3ms

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int A,B,W=0,t,n,m,i,j,q,a[1111],b[1111],c[1111];
        while(scanf("%d",&t),t)
        {
            W++;
            printf("Game %d:
    ",W);
            for(A=B=i=0;i<t;i++)
            {
                scanf("%d",&a[i]);
            }
            for(;;)
            {
                for(A=B=i=0;i<t;i++)
                {
                    scanf("%d",&b[i]);
                }
                for(i=0;i<t;i++)
                    c[i]=a[i];
                //strcpy(c,a);
                for(q=i=0;i<t;i++)
                {
                    if(b[i]==0)
                        q++;
                }
                if(q==t)
                    break;
                for(i=0;i<t;i++)
                {
                    if(a[i]==b[i])
                        A++;              //这个是序号能对应上的  个数....
                }
                for(i=0;i<t;i++)           //原版是a[i].c[i]是原版的复制品...b[i]是猜测的
                {
                    for(j=0;j<t;j++)
                    {
                        if(c[i]==b[j])
                        {
                            c[i]=b[j]=-741258;
                            B++;
                            break;
                        }
                    }
                }
                printf("    (%d,%d)
    ",A,B-A);
            }
        }
    }

     下面附上刘大婶的代码...相对来说人家的   又简单,时间复杂度又低

    #include<stdio.h>
    #define maxn 1010
    int main()
    {
        int A,B,i,n,d,a[maxn],b[maxn];
        int kase=0;
        while(scanf("%d",&n),n)
        {
            printf("Game %d:
    ",++kase);
            for(i=0;i<n;i++)             //   这是需要猜的数组.
                scanf("%d",&a[i]);
            for(;;)    //汗,  这里和大婶想的挺像的.
            {
                A=B=0;
                for(i=0;i<n;i++)         //这是  你猜的数组
                {
                    scanf("%d",&b[i]);
                    if(a[i]==b[i])      //在输入的时候就顺便得到了对应位置相同的  数字.
                        A++;
                }
                if(b[0]==0)// 英文题目上已经说过.
                    break;
                for(d=1;d<=9;d++)
                {
                    int c1=0,c2=0;    //
                    for(i=0;i<n;i++)
                    {
                        if(a[i]==d)   //统计一下   需要被猜的数组里面 1的个数
                            c1++;    
                        if(b[i]==d)   //统计一下   猜测数列里1的个数.
                            c2++;
                    }
                    if(c1<c2)         //然后将   相同的 加起来
                    {
                        B=B+c1;
                    }
                    else
                    {
                        B=B+c2;
                    }
                }
                  printf("    (%d,%d)
    ",A,B-A);
            }
        }
        return 0;
    }
  • 相关阅读:
    BZOJ3156 防御准备
    BZOJ1911 [APIO2010] 特别行动队
    BZOJ1096 [ZJOI2007] 仓库建设
    HDU
    斜率优化的各种板子
    HDU
    HDU
    HDU
    HDU
    HDU
  • 原文地址:https://www.cnblogs.com/A-FM/p/5100124.html
Copyright © 2020-2023  润新知