昨天下课路过隔壁班的时候,他们的老师问了一个问题,说你输入一个数n,然后输出所有1,2,3组成的长度为n的组合,回来的时候吃晚饭的时候,想了想,其实问题很简单,回溯和递归就可以搞定,回实验室后立马实验之,编译环境(linux anjuta gcc)
源代码:
* Created by Anjuta version 1.2.4a */
/* This file will not be overwritten */
/**********************
author: tjltail
time: 2007/3/26 17:46
**********************/
//这个是打印全部的可能
//假如要要求必须含有1,2,3至少一次的话,在printElem中加个判断就可以了
#include <stdio.h>
#define MAXLEN 100 //数组元素的个数
#define NUMBER 3 //数组元素的取值范围
int tempNum[MAXLEN];
void printElem(totalNum) //打印结果
{
int i ;
for ( i= 0 ; i < totalNum ; i ++ )
{
printf("%d",tempNum[i]) ;
}
printf(" ");
}
void getAllNum( int totalNum , int curLen)
{
int i ;
for ( i = 1 ; i <= NUMBER ; i ++ )
{
if ( curLen == totalNum) //当数组元素等于totalNum
{
printElem( totalNum) ;
return ;
}
tempNum[curLen ++ ] = i ;
getAllNum(totalNum ,curLen) ;
curLen -- ; //回溯
}
return ;
}
int main()
{
int total ;
printf("please input the number:");
scanf("%d",&total);
getAllNum(total, 0) ;
return (0);
}
/* This file will not be overwritten */
/**********************
author: tjltail
time: 2007/3/26 17:46
**********************/
//这个是打印全部的可能
//假如要要求必须含有1,2,3至少一次的话,在printElem中加个判断就可以了
#include <stdio.h>
#define MAXLEN 100 //数组元素的个数
#define NUMBER 3 //数组元素的取值范围
int tempNum[MAXLEN];
void printElem(totalNum) //打印结果
{
int i ;
for ( i= 0 ; i < totalNum ; i ++ )
{
printf("%d",tempNum[i]) ;
}
printf(" ");
}
void getAllNum( int totalNum , int curLen)
{
int i ;
for ( i = 1 ; i <= NUMBER ; i ++ )
{
if ( curLen == totalNum) //当数组元素等于totalNum
{
printElem( totalNum) ;
return ;
}
tempNum[curLen ++ ] = i ;
getAllNum(totalNum ,curLen) ;
curLen -- ; //回溯
}
return ;
}
int main()
{
int total ;
printf("please input the number:");
scanf("%d",&total);
getAllNum(total, 0) ;
return (0);
}