#include<algorithm> #include<iostream> using namespace std; #define dig_num 4 void cal( int str[] , int first , int last ) { if( first <= last ) { int i; if( first == last ) { for( i = 0 ; i <= last ; i ++ ) { cout << str[ i ]; } cout << endl; } if( first < last ) { int t; //依次将每一个位置的数放在最前面,然后递归调用,子问题 for( i = first ; i<= last ; i ++ ) { //将i位置的数与first位置的数交换,即将i位置数放在最前面 t = str[ i ]; str[ i ] = str[ first ]; str[ first ] = t; //递归调用,子问题 cal( str , first + 1 , last ); //状态恢复,即将i位置和first位置的数再换回来 t = str[ i ]; str[ i ] = str[ first ]; str[ first ] = t; } } } } bool get_f_l( int list[] , int &former , int &latter , int end ) { if( end > 0 ) { int p , q; for( p = end - 1 ; p >= 0 ; p -- ) { for( q = end ; q > p ; q -- ) { if( list[ p ] < list[ q ] ) { former = p; latter = q; return true; } } } return false; } return false; } void dic_sort( int list[] , int end ){ int former , latter; int i , j , t; //找到后面元素值比前面大的情况,即latter位置的值比former位置的值大 while( get_f_l( list , former , latter , end ) ){ for( i = 0 ; i <= end ; i ++ ) { printf( "%d" , list[ i ] ); } printf( "\n" ); //首先交换这两个位置的值 t = list[ former ]; list[ former ] = list[ latter ]; list[ latter ] = t; //这时候former后面的元素是从大到小的,现在需要将其对调,变成从小到大排序的 i = former + 1; j = end; while( i < j ) { t = list[ i ]; list[ i ] = list[ j ]; list[ j ] = t; i ++; j --; } } //输出最后一种情况,即从大到小有序的 for( i = 0 ; i <= end ; i ++ ) { printf( "%d" , list[ i ] ); } printf( "\n" ); } void cyc_shift( int list[] , int depth , int list2[] ) { if( depth < dig_num ) { int * a; int i; a = ( int * ) malloc( sizeof( int ) * ( depth + 1 ) ); for( i = 0 ; i < depth ; i ++ ) { a[ i ] = list2[ i ]; } //添加新元素 if( depth < dig_num ) { a[ depth ] = list[ depth ]; } //下面开始循环移位 int step; for( step = 0 ; step <= depth ; step ++ ) { int temp = a[ 0 ]; for( i = 0 ; i < depth ; i ++ ) { a[ i ] = a[ i + 1]; } a[ depth ] = temp; cyc_shift( list , depth + 1 , a ); } free( a ); } if( depth == dig_num ) { int i; for( i = 0 ; i < dig_num ; i ++ ) { printf( "%d" , list2[ i ] ); } printf( "\n" ); } } int main() { int *list; int i; list = ( int * ) malloc ( sizeof( int ) * dig_num ); for( i = 0 ; i < dig_num ; i ++ ) { list[ i ] = i + 1; } //字典序全排列 printf( "字典序全排列:\n" ); dic_sort( list , dig_num - 1 ); //递归无序全排列 printf( "递归无序全排列:\n" ); for( i = 0 ; i < dig_num ; i ++ ) { list[ i ] = i + 1; } cal( list , 0 , 3 ); //循环移位全排列 printf( "循环移位全排列:\n" ); for( i = 0 ; i < dig_num ; i ++ ) { list[ i ] = i + 1; } cyc_shift( list , 0 , NULL ); free( list ); return 0; } #include<iostream> using namespace std; void dfs( int list[] , bool flag[] , int *a , int depth ){ if( depth < 4 ) { int * b; int i; b = ( int * ) malloc( sizeof( int ) * ( depth + 1 ) ); for( i = 0 ; i < depth ; i ++ ) { b[ i ] = a[ i ]; } for( i = 0 ; i < 4 ; i ++ ) { if( ! flag[ i ] ) { flag[ i ] = true; b[ depth ] = list[ i ]; dfs( list , flag , b , depth + 1 ); flag[ i ] = false; } } free( b ); } else if( depth == 4 ){ int i; for( i = 0 ; i < 4 ; i ++ ) { cout << a[ i ]; } cout << endl; } } int main() { int list[ 4 ] = { 1 , 2 , 3 , 4 }; bool flag[ 4 ] = { false }; dfs( list , flag , NULL , 0 ); return 1; }