比如现在有个二维数组 a[1024][10],想往里面填充数据,填充方式如下所展示: AAAAAAAAAA //没有B的形式 
AAAAAAAAAB //下面10行是1个B的情况,行个数可以通过组合C1/10算出 
AAAAAAAABA 
.... 
BAAAAAAAAA 
AAAAAAAABB //下面45行是2个B的情况,行个数可以通过组合C2/10算出 
AAAAAAABAB  
... 
AAAAAAABBB //下面120行是3个B的情况,行个数可以通过组合C3/10算出 
AAAAAABABB  
...... .... //按照此规律下去,最后一行全是B 
BBBBBBBBBA 
BBBBBBBBBB //最后一行 
不知道各位看懂了么,每行n个B的情况,可以通过Cn/10的组合计算公式算出来所需要的行数。 想了好久不知道该如何下手,高手把代码贴上来参考参考吧》?

解决方案 »

  1.   

    to 楼上:
    其实 用 01代替AB填充也行。
    最终的结果是要把 两个字母AB(或数字01)所有的组合列出来,存放在二维数组中
    可以不必管排序的问题
      

  2.   

    可以换一种思路
    0000000000~1111111111的填充
    找出0~1023之间含有几个1的二进制数
    假设符号^为乘方
    含有1个1的是2^x      (9>=x>=0)
    含有2个1的是2^x+2^y  (9>=x>y>=0)
    含有3个1的是2^x+2^y+2^z  (9>=x>y>z>=0)
    .....还有一种方法是
    int i=0;
    while(x)
    {
    x=x&(x-1);
    i++;
    }
    这样直接判断某个2进制数含有几个1,从0~1023循环判断一下就好
      

  3.   

    #include<iostream>
    using namespace std;int nHalf =1;
    void SetValue(int a[][10],int n)
    {
       nHalf *= 2;
       int nPart = 1024/nHalf;
       for(int i = 0;i < nHalf;i++)
       {
     if(i % 2 == 0)
                for(int j = 0;j < nPart;j++)
              a[i*nPart+j][n] = 0;
             else
    {
    for(int j = 0;j < nPart;j++)
              a[i*nPart+j][n] = 1;
    }
       }
    }void main()
    {
    int a[1024][10];
    for(int i = 0;i < 10;i++)
    {
               SetValue( a,i);
    }
    for(i = 0;i < 1024;i++)
    {
    cout<<i<<" = ";
    for(int j = 0;j < 10;j++)
    {
    cout<<a[i][j];
    }
    cout<<endl;
    }
    }试试我的这个算法是否符合你的要求!!
      

  4.   

    to bitxinhai:
    这个符合,是按列来排的吧??能不能讲讲思路?没看明白呀。
      

  5.   

    你这里只有2个字母,假如A用0表示,B用1表示,则AAABBAAAAA等价于0001100000,这样有多少个b,就等价于这一行有多少个1,当你列完所有情况后,就等价于遍历了0-1111111111之间所有的二进制数所以你可以遍历上述二进制数,然后根据每个二进制数包含1的个数的情况进行排序,排序后的结果就是你所要求的
      

  6.   

    思想:
    每次给啊【1024】【10】的一列赋值,来确定其0(A),1(B)的分割情况
    例如:
      第一次:第一列
          0-511 赋值为0
         512-1023 赋值为1
      第二次:第二列
          0-255赋值为0
         256-511 赋值为1
         512-767 赋值为0
         760-0.23 赋值为1看到规律来吧,实际就是一个
                1
               |
               |
        _____________
        |            |
        2            2
        |            |
    ________      __________
    |       |     |        |
    3      3      3         3按规律赋值的过程#include <iostream> 
    using namespace std; int nHalf =1; 
    void SetValue(int a[][10],int n) 

       nHalf *= 2; //切分区域数
       int nPart = 1024/nHalf; //n列的切分大小
       for(int i = 0;i  < nHalf;i++) 
       { //切分区域的赋值
         if(i % 2 == 0) 
          for(int j = 0;j  < nPart;j++) 
              a[i*nPart+j][n] = 0; 
             else 
               { 
               for(int j = 0;j  < nPart;j++) 
                   a[i*nPart+j][n] = 1; 
                } 
       } 
    } void main() 

    int a[1024][10]; 
    for(int i = 0;i  < 10;i++) 
    { //
               SetValue( a,i); 

    for(i = 0;i  < 1024;i++) 

    cout < <i < <" = "; 
    for(int j = 0;j  < 10;j++) 

    cout < <a[i][j]; 

    cout < <endl;