Small-Chao

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目:输入一个数字,如3,要求输出6个数字,1,1,2,2,3,3,即每个数字输出两次,组成的字符串符合要求:两个1中有1个数字,两个2中有2个数字,两个3中有三个数字,即312132,如果有多种排列方法,则全部输出



我的解法

#include <stdio.h>
#include <memory.h>

void SonFun(int num, int *flag,int Sum)
{
  int *temp = new int[Sum];

  for(int i=0; i<Sum; i++){
    memcpy(temp,flag,Sum*sizeof(int));
    if(i+num+1 >= Sum) break;
    if(*(flag+i) != 0 || *(flag+i+num+1) != 0) continue;
    *(flag+i) = num;
    *(flag+i+num+1) = num;
    if(num>1){
      SonFun(num-1, flag, Sum);
      memcpy(flag, temp, Sum*sizeof(int));
    }
  }
  if(num == 1)
  {
    for(int i=0; i<Sum; i++){
      if(*(flag+i) == 0) break;
    }
    if(i == Sum){
      for(int j=0; j<Sum; j++){
      printf("%d ",*(flag+j));
      }
    printf("\n");
    }
  }
  delete []temp;
}
void MainFun(int num)
{
  int *flag = new int[num*2];
  int end = num*2;
  for(int i=0; i<end; i++)
  {
    memset(flag, 0, sizeof(int)*num*2);
    if(i+num+1 >= end) break;
    *(flag+i) = num;
    *(flag+i+num+1) = num;
    SonFun(num-1, flag, end);
  }
  delete []flag;
}
int main(int argc,char **argv)
{
  MainFun(8);
  return 1;
}


欢迎大家批评指正,

posted on 2011-10-08 15:45  Small-Chao  阅读(331)  评论(1编辑  收藏  举报