說下思路就可以,我自己去寫代碼。
uj5u.com熱心網友回復:
比如123和321算不算一組的相同情況?如果不算,可以1-9九個數字做全排列,然后前三個一組,中間三個一組,后三個一組,即可
如果算,那就在上面的基礎上去掉重復的資料
uj5u.com熱心網友回復:
算,那個全排列能解釋下嗎
uj5u.com熱心網友回復:
學過數學的排列組合嗎?沒學過可以在網上搜索資料先學習理解
9個數子的全排列如下,就是每個位置放不同的數字就是一種排列
123456789
123456798
123456879
...
132456789
132456798
132456879
...
...
912345678
912345687
912345768
...
...
987654321
找出9個陣列的所有排列后,3個3個分段即可
uj5u.com熱心網友回復:
這其實就是個全排列的程式。(注意一下,全排列這東西,在小規模資料列舉法的圈圈兒里,還是有一定的出鏡率的。)它的作用就是輸出一組資料(比如123456789)的所有排列可能。我最喜歡的寫法是這樣的,兄弟理解下:
//******************************************************************************
// 全排列程式
//******************************************************************************
#define N 3
#include <stdio.h>
int d[N];
// 輸出一下
void write()
{
int i;
for(i=0; i<N; i++)
printf("%d ", d[i]);
printf("\n");
}
// 交換d[i]和d[j]
void swap(int i, int j)
{
int t;
t=d[i];
d[i]=d[j];
d[j]=t;
}
// 它的作用是“得到d[k]~d[N-1]范圍內的所有排列形式”
int f(int k)
{
int i;
if(k==N-1) // 只剩一個數了,沒啥好排列的,輸出即可
write();
else
for(i=k; i<N; i++) // d[k]~d[N-1]范圍內,每個數都能當第一個
{
swap(k, i); // 換到第一個
f(k+1); // 剩下的遞回運行
swap(k, i); // 換回來
}
}
//******************************************************************************
// 主函式
//******************************************************************************
int main(int argc, char *argv[])
{
int i;
for(i=0; i<N; i++)
d[i]=i+1;
f(0);
return 0;
}
uj5u.com熱心網友回復:
看不懂啊啊啊啊啊啊啊啊啊啊啊啊啊uj5u.com熱心網友回復:
STL里面不是有一個全排列函式嗎
uj5u.com熱心網友回復:
這個遞回理解需要什么基礎嗎,這兩天一直在看

像這種兩個函式中間夾個遞回函式的怎么運行的都沒搞明白,漢諾塔那個也是,不過簡單像fib數列倒是明白
uj5u.com熱心網友回復:
遠離高數很多年uj5u.com熱心網友回復:
#include<stdio.h>#include<string.h>
#include<stdlib.h>
void swap(char *a,char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
void Allarrange(char *str,int k,int len)
{
int i;
if(k==len)
{
static int s_i=1;
//printf("第%d種排列為:\t%s\n",s_i++,str); //全排列輸出
printf("第%d種排列為:\t",s_i++); //針對本題目進行的修改輸出
printf("%c%c%c ",str[0],str[1],str[2]);
printf("%c%c%c ",str[3],str[4],str[5]);
printf("%c%c%c\n",str[6],str[7],str[8]);
}
else
{
for(i=k;i<=len;i++)
{
swap(str+i,str+k);
Allarrange(str,k+1,len);
swap(str+i,str+k);
}
}
}
int main()
{
char str[10]={'1','2','3','4','5','6','7','8','9'};
Allarrange(str,0,strlen(str)-1);
return 0;
}
下圖是運行結果,一共是9!次,也就是362 880組,每組里面有三個3位數。
uj5u.com熱心網友回復:
可以參考我的一篇講解全排列的帖子uj5u.com熱心網友回復:
遞回理解起來也很簡單,就是你自己跟著代碼去看,然后自己畫一個堆疊,每執行一次遞回就入堆疊一次,每一次遞回的完成就相當于出堆疊一次,這樣結合起來看就比較容易了,系統也是用遞回作業堆疊去完成遞回的運算的uj5u.com熱心網友回復:
所有可能有點多啊.如果考慮順序, 有 9! 大約36萬種.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/66122.html
標籤:C語言
上一篇:請教大佬c語言
下一篇:cin >> hex 的問題
