对于一个给定的规则,如AABAB (该规则表示字符串的第1,2,4为必须相等,第3,5为必须相等),当然这是规则之一!现在将从00000 - 99999中将符合规则(“AABAB”)的数字列出:
则她可能是:
00101
00202
...
44606
...
88909
...当规则为“AAABB”的话,则这些数字可能为
00011
00022
00033
...
44488
...
66699
...请问,这样的算法应该怎么实现?不管采用何种语言来实现!

解决方案 »

  1.   

    什么语言都能实现。语言是工具,请搞清楚这个概念。好像大刀和铁锹都是工具,都能挖土,只是铁锹挖起来更方便而已。for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    if(i!=j)
    printf("%d%d%d%d%d\n",i,i,,j,i,j);这就是你那个AAABAB的算法。其它的依葫芦画瓢
      

  2.   

    如果是AABAB,那那就万位,千位和十位相等,百位和个位相等
    比如说取个位就是nNum-(int(nNum/10))*10,不知道是不是符合你的要求
      

  3.   

    for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    if(i!=j)
    printf("%d%d%d%d%d\n",i,i,j,i,j);这就是你那个AABAB的算法。其它的依葫芦画瓢
      

  4.   

    穷举之:
    char rule[5];//规则字符串
    int answer[5];//结果
    int flag[5];
         void Test( char *ptr)
           {  int i=0; 
               while(ptr!='\0')
                {
                 swith(*ptr)
                    case: "A"  flag[i++]=0;continue;
                    case: "B" flag[i++]=1; continue;
                 }
                      
             }
        main() 
          {     
                 Test(rule);   
                  
                 for(int j=0;j<9;j++)
                  for(int i=0;i<9;i++)
                   {if(i==j) countinue;
                      for(int k=0;k<5;k++)
                      {  if(flag[k])
                          answer[k]=j;
                          else answer[k]=i;
                          cout<<........   ;          //输出answer
                       }
                    }
         }
          写个思路, 没有调式的哦
      

  5.   

    各位似乎都没有明白我的意思,我现在所遇到的情况是,这些规则不是固定的,如果是固定的话,那当然很简单!关键是要怎样去解析这个规则!你应该这样去想,用户可以输入任意形式的规则!如可能是“AA”,"ABA", "AABB"等等
    你根本不知道用户所输入的是什么规则,怎么能按上面的方式去做?
      

  6.   

    /*
    思路:不妨称00000~99999为目标码,称AAABB为特征码,其中有两个不同的码字A和B。
    首先找出特征码中所有不同的码字,并为其分配码值,码值取目标码中相应位的数值。
    判断方法:当不同特征码存在相同码值时,目标码不符;当目标码与对应位的特征码值不同时,不符。
    */
    //附源码——可以优化:一次性取得所有不同特征码字,循环处理时分配码值
    #define MAXLEN 5
    void CTestDlg::OnDo() 
    {
    char standard[MAXLEN+1]="ABABA";//注意限定长度
    char source[MAXLEN+1];
    char record[MAXLEN];
    char value[MAXLEN];
    int total,count;
    //总循环:处理每一个数值
    for(int i=0;i<19999;i++)
    {
    //转成字符,便于处理
    sprintf(source,"%05d",i);//注意限定长度
    total=0;//是否提前终止判断
    count=0;//判断标准中的不同特征码记数
    //循环处理判断标准中每一位特征码
    for(int j=0;j<strlen(standard)&&total==0;j++)
    {
    //判断当前特征码是否重复
    for(int k=0;k<count;k++)
    {
    if(record[k]==standard[j])
    break;
    }
    if(k==count)//不重复则添加
    {
    record[k]=standard[j];
    value[k]=source[j];
    //判断当前特征码的码值是否重复,不同特征码的码值不能重复,否则判断失败
    for(k=0;k<count;k++)
    if(value[k]==source[j])
    {
    j=strlen(standard);//结束外层循环
    total=-1;
    break;//退出当前循环
    }
    count++;
    }
    else//重复则判断
    {
    //如果total不为0,表示当前位不符合判断标准
    total=source[j]-value[k];
    }
    }
    if(total==0)
    AfxMessageBox(source);
    else SetWindowText(source);
    }
    }
      

  7.   

    那不过是改变判断规则字符串的长度 和 修改flag 数组的长度的问题吧?!
      

  8.   


    代码实在没空写,因为字符串可以判断长度,根据组合数计算,可以算
    出比较循环和次数和位置。所以可以做到,如果只是用 AABAA这样的类似定义规则,判断字符串的长度,
    使任意两个字符比较结果跟对应数字位置比较结果一致,不一致则剔除。
      

  9.   

    printAB(BOOL flag[5])   //A: true, B: false
    {       
    for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    if(i!=j)
    printf("%d%d%d%d%d\n",flag[0]?i:j,flag[1]?i:j,flag[2]?i:j,flag[3]?i:j,flag[4]?i:j);
    }
      

  10.   

    BOOL flag[MAX];
    printAB(BOOL flag[MAX],int len)   //A: true, B: false
    {       
    for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    {
    for(int k=0;k<len;k++)
    if(i!=j)   printf("%d",flag[k]?i:j);
    printf("\n");
    }
    }
      

  11.   

    printAB(char AB[])  
    {       
    for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    {
    for(int k=0;(k<len)&&(AB[k] != '\0');k++)
    if(i!=j)   printf("%d",(AB[k]=='A')?i:j);
    printf("\n");
    }
    }
      

  12.   

    首先判断规则的长度,定义个以CString.
    然后根据给定的规则,在相应的位置填充字符