X-man

导航

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;
}

 

posted on 2013-04-22 16:34  雨钝风轻  阅读(305)  评论(0编辑  收藏  举报