a[n][m]
当n=1;m=2;
(1)a[1][1]=x;
(2)a[1][2]=x当n=2;m=2
(1){a[1][1]=x,a[2][1]=x};
(2){a[1][1]=x,a[1][2]=x};
(3){a[1][2]=x,a[2][1]=x};
(4){a[1][2]=x,a[2][2]=x}当n=3;m=2
(1){a[1][1]=x,a[2][1]=x,a[3]a[1]=x};(2){a[1][1]=x,a[2][1]=x,a[3][2]=x;}
(3){a[1][1]=x,a[2][2]=x,a[3]a[1]=x};(4){a[1][1]=x,a[2][2]=x,a[3][2]=x;}
(5){a[1][2]=x,a[2][1]=x,a[3]a[1]=x};(6){a[1][2]=x,a[2][1]=x,a[3][2]=x;}
(7){a[1][2]=x,a[2][2]=x,a[3]a[2]=x};(8){a[1][2]=x,a[2][2]=x,a[3][2]=x;}当n=4;m=2;
...................
当n=5;m=2
.....................
现假设M不变为2减少难度,N是可以改变的也就是有2^N的组合赋值方式请问这种算法
这样解决啊,这样编!

解决方案 »

  1.   

    用两个嵌套的for循环。
    for (i = 0; i < n; i++)
      for (j = 0; j < m; j++)
        a[i, j] = x;
      

  2.   

    对不起,还有点忘记申明
    1。其实这个问题类似排列组合问题
    2. 当N=1时只要拿出一个数给它赋值
       当N=2时每次拿出2个数,每次依次改变一个数到两个数(直到没有重复)并给它赋值也就是2^2=4
       当N=3时每次拿出3个数,每次依次改变一个数。两个数、三个数(直到没有重复)并给它赋值也就是2^3=8
       当N=4时每次拿出4个数,每次依次改变一个数。两个数、三个,四个数(直到没有重复)并给它赋值也就是2^4=16不识这样表述大家明白么?
      

  3.   

    也就是
    char c[13];
    a[n][m]
    当n=1;m=2;
    (1)c[1]=0x30+a[1][1];
    (2)c[1]=0x30+a[1][2];当n=2;m=2
    (1){c[1]=0x30+a[1][1],c[2]=0x30+a[2][1]};
    (2)c[1]=0x30+a[1][1],c[2]=0x30+a[1][2]};
    (3){c[1]=a[1][2],c[2]=a[2][1]};
    (4){c[1]=a[1][2],c[2]=a[2][2]}当n=3;m=2
    (1){c[1]=a[1][1],c[2]=a[2][1],c[3]=a[3]a[1]};(2){c[1]=a[1][1],c[2]=a[2][1],c[3]=a[3][2];}
    (3){c[n]=a[1][1],c[n]=a[2][2],c[n]=a[3]a[1]};(4){c[n]=a[1][1],c[n]=a[2][2],c[n]=a[3][2];}
    (5){c[n]=a[n][2],c[n]=a[n][1],c[n]=a[n]a[1]};(6){c[n]=a[n][2],c[n]=a[n][1],c[n]=a[n][2];}
    (7){c[n]=a[n][2],c[n]=a[n][2],c[n]=a[n]a[2]};(8){c[n]=a[n][2],c[n]=a[n][2],c[n]=a[n][2];}当n=4;m=2;
    ...................
    当n=5;m=2
    .....................
    这种算法谁能归纳一下
    我可不想用穷举法
      

  4.   

    这个问题可以这么理解
    不要想象他是几维的数组,考虑成一队士兵X个排成一列,从中选出Y个士兵,要求这次选择的不能和以前的完全相同#define Y 10
    #define X 2*Yint i, j;
    int y[ Y ];
    int x[ X ];for( i = 0; i < X; i++ )
    x[ i ] = X;memset( y, 0, sizeof( int ) / sizeof( char ) );
    i = 0;
    while( y[ 0 ] < X )
    {
    y[ 1 ] = y[ 0 ] + 1;
    while( y[ 1 ] < X )
    {
    //y[ 2 ] = y[ 1 ] + 1;
    //...
    y[ 1 ]++;
    }
    y[ 0 ]++;
    }
      

  5.   

    jennyvenus(JennyVenus)谢谢你明白我意思我开始也是想用递归可是自己不太明白。下面有相同的帖子分一起给
    http://expert.csdn.net/Expert/topic/1170/1170290.xml?temp=.9134027
      

  6.   

    jennyvenus我一直在想有不能考虑成一队士兵X个排成一列,从中选出Y个士兵,应该看成
      A1,B1,C1
      A2,B2,C2
    从这六个数里拿出三个数如A1出局A2就不能出局这样有多少次组合呢
      

  7.   

    我是不行了,找找masterz吧,我一会儿时间内是搞不定了
      

  8.   

    我把它考虑的太简单了
    总体思路还是这样的,我给你把真正的高手都找来int i[ Y ];for( i[ 0 ] = 0; i[ 0 ] < X; i[ 0 ]++ )
      for( i[ 1 ] = i[ 0 ] + 1; i[ 1 ] < X; i[ 1 ]++ )
        ...
          for( i[ Y - 1 ] = i[ Y - 2 ] + 1; i[ Y - 1 ] < X; i[ Y - 1 ]++ )
          {
            printf( "%d", i[ 0 ] );
            printf( "%d", i[ 1 ] );
            ...
            printf( "%d", i[ Y - 1 ] );
          }
      

  9.   

    一直在想有不能考虑成一队士兵X个排成一列,从中选出Y个士兵,应该看成
      A1,B1,C1
      A2,B2,C2
    从这六个数里拿出三个数如A1出局A2就不能出局这样有多少次组合呢
                            B1出局B2就不能出局
                            C1出局C2就不能出局
    A1,B1,C1 / A1,B1,C2 / A1,B2,C1 / A1,B2,C2/
    A2,B1,C1 /A2,B1,C2 / A2,B2,C1  /A2,B2,C2 /还可以看成现在有三个位子,3组学生,每组2个同学
    每组只允许一个同学坐这位子,这样有多少种组合呢?
      

  10.   

    to jennyvenus(JennyVenus)
    听兄台解释我才明白,等我想一想。
      

  11.   

    A1 B1 C1
    A2 B2 C2不就是 2*2*2=8吗?其他也是.
    比如
    A1 B1 C1 D1
    A2 B2 C2 D2
    A3 B3 C3 D3
    就是 3*3*3*3=81种。
      

  12.   

    to:iicup(双杯献酒)
    对你分析没错
    这样写成算法呢!
      

  13.   

    //如若你要对M^N个数据赋值,
    //可以用一维数组来模拟多维数组。
    //比如
    //int a[2][2][2];
    //你可以用 b[2*2*2]来代替,
    //而使用的时候 a[1][0][1]就是b[1*2*2+0*2+1]//举例:M=每维下标 N=维数#define M 3
    #define N 4long* pData; // data[3][3][3][3]#include <iostream>
    #include <math.h>
    //#include <stdio.h>
    using namespace std;int main()
    {
     
     char str[100];
     char strtemp1[100];
     char strtemp2[100];
     int len=pow(M,N);
     pData=new long[len];
     int i;
     for(i=0;i<len;i++)pData[i]=i;//赋值
     //显示
     for(i=0;i<len;i++)
     {
      int j;
      int temp=i;
      strcpy(str,"");
      strcpy(strtemp1,"");
      strcpy(strtemp2,"");
      for(j=0;j<N;j++)
      {
       itoa(temp%M,strtemp2,sizeof(strtemp2));
       strcat(strtemp1,"[");
       strcat(strtemp1,strtemp2);
       strcat(strtemp1,"]");
       temp/=M;
       strcat(strtemp1,str);
       strcpy(str,strtemp1);
       strcpy(strtemp1,"");
      }
      strcpy(strtemp1,"\nData");
      strcat(strtemp1,str);
      cout<<strtemp1<<"="<<pData[i];//数值
     }
     cout<<endl;
     return 0;
    }运行结果
    Data[0][0][0][0]=0
    Data[0][0][0][1]=1
    Data[0][0][0][2]=2
    Data[0][0][1][0]=3
    //省略
    Data[2][2][2][0]=78
    Data[2][2][2][1]=79
    Data[2][2][2][2]=80
      

  14.   

    最后还应该
    delete[] pData;
    忘记了。
    会导致内存泄露.
      

  15.   

    to:iicup(双杯献酒)
    妙哉!谢谢!
      

  16.   

    to:iicup(双杯献酒)来接分
    http://expert.csdn.net/Expert/topic/1170/1170290.xml?temp=.9134027
      

  17.   

    哈哈哈,我终于明白了。
    其实我的解题思路和 iicup(双杯献酒)是一样的,但是我却陷于算法解题,所以始终找不到算法,而iicup(双杯献酒)却绕过了算法解题,他自己把题目解了,他所做的只是把答案列出来。
    高实在是高,哈哈哈,很开心,我又学了一招,很懊恼我为什么就没想到呢?