• hdu 1172(猜数字)一千个WA的缘由


    思路一:
    先初始化b数组1000~9999;
    然后每输入一个条件就更新b数组;
     最后看b数组中的个数,为1 yes;or no;
    @@@@数组更新较难处理
    思路二:
    保存所有条件;
    看1000~9999中每个数能过全部的条件
    保存符合条件的个数;
    较优:
                 for(int k=0;k<4;k++)
                    {
                        int t=a[k]-'1'+1;//化为整数
                        if(j1==t)
                        {
                            Bi++;
                            if(k==0)Ci++;
                        }
                        else if(j2==t)
                        {
                            Bi++;
                            if(k==1)Ci++;
                        }
                        else if(j3==t)
                        {
                            Bi++;
                            if(k==2)Ci++;
                        }
                        else if(j4==t)
                        {
                            Bi++;
                            if(k==3)Ci++;
                        }
                    }
    出错数据 :
    4234 3124 对比
    

      思路一:

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int main()
    {
        int N,size,sizei;
        char a[5];
        int t[5];
        int jt[5];//保存数的各位
        int b[9005];
        int A,B,C;
        int Bi,Ci;
        int i,j,ii,jj;
        while(scanf("%d",&N)!=EOF&&N!=0)
        {
            memset(a,0,sizeof(a));
            memset(t,0,sizeof(t));
            memset(jt,0,sizeof(jt));
            for(i=1000,j=0; i<10000; j++,i++)
                b[j]=i;//数组初始化
            sizei=9000;//数组大小
            for(i=0; i<N; i++)
            {
                scanf("%s %d %d",a,&B,&C);
                size=0;//每输入一次,b数组就更新
    
                for(int ji=0; ji<sizei; ji++) //枚举b数组中的数
                {
                    j=b[ji];
                    for(int k=0; k<4; k++)
                        t[k]=a[k]-'1'+1;//化为整数
                    jt[0]=j/1000;
                    jt[1]=(j%1000)/100;
                    jt[2]=(j%100)/10;
                    jt[3]=j%10;
                    Bi=0;//对了多少个数字
                    Ci=0;//对的位置
                    //printf("%c %c\n",j1,j2);
                    for(int k=0; k<4; k++)
                        if(jt[k]==t[k])jt[k]=-1,t[k]=-2,Ci++,Bi++;
                    for(int k=0; k<4; k++)
                    {
                        //后判断对的数字数,不能重复相等 eg:2111 1345
                        if(jt[0]==t[k]){Bi++;jt[0]=-1;t[k]=-2;}
                        else if(jt[1]==t[k]){Bi++;jt[1]=-1;t[k]=-2;}//忘了
                        else if(jt[2]==t[k]){Bi++;jt[2]=-1;t[k]=-2;}//忽略了
                        else if(jt[3]==t[k]){Bi++;jt[3]=-1;t[k]=-2;}//Wa伤了
                    }
                    //printf("#%d %d\n",Bi,Ci);
                    if(Bi==B&&Ci==C)b[size++]=j;
                    //printf("#%d\n",size);
                }
                sizei=size;
                //for(j=0;j<size;j++)
                //printf("%d ",b[j]);
                //printf("$%d\n",size);
            }
            if(sizei!=1)printf("Not sure\n");
            else printf("%d\n",b[0]);
        }
        return 0;
    }
  • 相关阅读:
    导出数据到Excel文件
    判断是否在某个时间段以内
    获取网络图片并保存到指定目录
    创建目录并且将数据写入txt文件、删除指定目录下的文件
    获取二维数组中指定字段的值,并且将值组成一维数组
    JS--获取月份天数
    php---邮件发送
    3D--魔方
    leetcode每日一题之10.分割回文串 II
    leetcode每日一题之9.最长递增子序列
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3035782.html
Copyright © 2020-2023  润新知