昨天下课路过隔壁班的时候,他们的老师问了一个问题,说你输入一个数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 );
}