有一组数0..N,我要用一个大写的字母A来代替这组数(有顺序的排列),可以代替一个(如:0,1,2,A.....N这只是一种情况,并且不能重复),也可以代替两个(如:0,1,A,A.....N这只是一种情况,并且不能重复),也可以代替3个(如:0,A,A,A.....N这只是一种情况,并且不能重复)....最多可以代替N个(就是全部都替换成A),请问这种算法怎么实现?能给出具体的实现代码吗?谢谢大家了!

解决方案 »

  1.   

    第一步:  A,1,2,3....N;
            0,A,2,3....N;
            0,1,A,3....N;
            ............;
            0,1,2,3....A;第二步:  A,A,2,3....N;
            0,A,A,3....N;
            0,1,A,A....N;
            ............;
            0,1,2,3...A,A;.....:第N-1步: A,A,A.....A,N;
             0,A,A.....A,A;第N步:  A,A,A.......A,A;
            
      

  2.   

    上面有誤,
    從0開始,
    糾正: 第N-1步改為第N步; 第N步改為第N+1步.
      

  3.   

    lqiiqqqq 已经给出方法了。循环来置值就是了。
      

  4.   

    呵呵,感觉没什么意思,可能楼主还没说出你到底想得到什么吧,要是罗列出所有的替换,那lqiiqqqq 已经说的够了
      

  5.   

    具体每一步用delphi代码怎么实现?我想要得到的结果是每一个具体的组合,就是罗列出所有的替换!请大侠们帮帮忙,老板急着要啊,我都郁闷惨了!
      

  6.   

    算法比较复杂procedure TForm1.Button1Click(Sender: TObject);
    const
      N=2;//数组大小
    var
      srcArray,tempArray:array of Integer;
      i,k,j,z:Integer;
      outStr:string;
    begin
      SetLength(srcArray,N+1);
      SetLength(tempArray,N+1);
      //初始化
      for i:=0 to N do
      begin
        srcArray[i]:=i;
      end;
      //循环
      for i:=1 to N+1 do
      begin
        for k:=0 to N-(i-1) do
        begin
          CopyMemory(@tempArray[0],@srcArray[0],(N+1)*4);
          for j:=k to k+i-1 do
            tempArray[j]:=-1;//'A'临时用-1代替
          outStr:='';
          for z:=0 to N do
          begin
            if z>0 then outStr:=outStr+',';
            if tempArray[z]=-1 then
             outStr:=outStr+'A'
            else
             outStr:=outStr+IntToStr(tempArray[z]);
          end;
          Memo1.Lines.Add(outStr);
        end;
      end;
    end;