#include
#include
int x=0;
void permutation_combination(int num[4])
{
int temp[4];
int answer[1000][4];
for(int i = 0 ; i < 4 ; i++)
{
temp[0] = num[i];
for(int j = 0 ; j < 4 ; j++)
{
if(num[j] != temp[0])
{
temp[1] = num[j];
for(int k = 0 ; k < 4 ; k++)
{
if(num[k] != temp[0] && num[k] != temp[1]){
temp[2] = num[k];
for(int l = 0 ; l < 4 ; l++)
{
if(num[l] != temp[0] && num[l] != temp[1] && num[l] != temp[2])
{
temp[3] = num[l];
answer[x][0] = temp[0];
answer[x][1] = temp[1];
answer[x][2] = temp[2];
answer[x][3] = temp[3];
x++;
}
}
}
}
}
}
}
for(int a = 0 ; a < x ; a++){
printf("%d\t=\t%d %d %d %d\n" , a , answer[a][0] , answer[a][1] , answer[a][2] , answer[a][3]);
}
}
void main(){
int num[]={1,2,3,4};
permutation_combination(num);
}
網址
http://blog.blueshop.com.tw/starlightslo/articles/20578.aspx
2006-12-10 14:51:49 · 2 個解答 · 發問者 kill 1 in 電腦與網際網路 ➔ 程式設計
重點;找出4個數所有的排列方法
每個位置都從第一數試到第四數
祇要不和前面一樣就可以放
#include
#include
int x=0; /* 第0種排法 */
void permutation_combination(int num[4])
{
int temp[4]; /* 儲存目前的排法 */
int answer[1000][4]; /* 儲存所有的排法 */
for(int i = 0 ; i < 4 ; i++)
{
temp[0] = num[i]; /* 第一個位置的數 */
for(int j = 0 ; j < 4 ; j++)
{
if(num[j] != temp[0]) /* 不可以和第一個數一樣 */
{
temp[1] = num[j]; /* 第二個位置的數 */
for(int k = 0 ; k < 4 ; k++)
{
if(num[k] != temp[0] && num[k] != temp[1]){/* 不可以和一二數一樣 */
temp[2] = num[k]; /* 第三個位置的數 */
for(int l = 0 ; l < 4 ; l++)
{
if(num[l] != temp[0] && num[l] != temp[1] && num[l] != temp[2]) /* 不可以和一二三數一樣 */
{
temp[3] = num[l]; /* 第四個位置的數 */
/* 儲存目前的排法到第x種排法的位置 */
answer[x][0] = temp[0];
answer[x][1] = temp[1];
answer[x][2] = temp[2];
answer[x][3] = temp[3];
x++;
}
}
}
}
}
}
}
/* 印出所有的排法 */
for(int a = 0 ; a < x ; a++){
printf("%dt=t%d %d %d %dn" , a , answer[a][0] , answer[a][1] , answer[a][2] , answer[a][3]);
}
}
void main(){
int num[]={1,2,3,4};
permutation_combination(num);
}
2006-12-13 00:31:20 · answer #1 · answered by JJ 7 · 0⤊ 0⤋
因字數限制,只寫一些+流程,其他刪了,要問的話寄信問吧
/*這時出現第一組排列組合,存到answer[x]中*/
answer[x][0] = temp[0];
answer[x][1] = temp[1];
answer[x][2] = temp[2];
answer[x][3] = temp[3];
x++;
/*流程:
1.i=0,temp[0]=num[0]=0;j=0,num[j]=0=temp[0],j=1;num[j]=1!=temp[0]→temp[1]=num[1]=1;
k=0,num[0]=0=temp[0].k=1,num[1]=1=temp[1].k=2,num[2]=2!=temp[0]&&num[2]!=temp[1]→temp[2]=num[2]=2
l=0開始檢查,前三個都不符合,到l=3,num[3]符合三個條件→temp[3]=num[3]=3→第一個組合=0123
之後l=4,檢查完了,回到k=3
2.k=3,num[3]=3符合兩個條件→temp[2]=3,之後l從0開始檢查,l=2時,符合三個條件→temp[3]=num[2]=2→0132
之後l=3不符合if的三個條件,l=4就跳出,回到k=4,也跳出,之後回到j=2
3.j=2,符合條件→temp[1]=num[2]=2;k=1,符合條件→temp[2]=num[1]=1;l=3時符合→temp[3]=num[3]=3→0213
之後l=4跳出,回到上面的k=2
4.k=2,不符合,k=3,符合條件→temp[2]=num[3]=3; l=1時符合條件→temp[3]=num[1]=1→0231
之後l=2,3都不符合,l=4跳出,回到上面的k=4,跳出,再回到j=3
5.j=3,符合→temp[1]=num[3]=3,k=1,符合條件→temp[2]=num[1]=1;l=2時符合→temp[3]=num[2]=2→0312
之後l=3不符合,l=4跳出,回到上面的k=2
6.k=2,符合→temp[2]=num[2]=2; l=0不符合, l=1時符合→temp[3]=num[1]=1 →0321
之後l=2,3 都不符合→l=4跳出,回到上面的k=3,不符合,k=4跳出→回到j=4,也跳出→回到 i=1
7.i=1,temp[0]=num[1]=1;j=0,num[j]=0!=temp[0]→temp[1]=num[0]=0
k=0,1都不符合,k=2時符合→temp[2]=num[2]=2; l=0,1,2都不符合,l=3時符合→temp[3]=num[3]=3→1023
以下類推…=1032,1203,1230,1302,1320, 2013,2031,2103,2130,2301,2310, 3012,3021,3102,3120,3201,3210
*/
2006-12-12 23:41:16 · answer #2 · answered by ? 5 · 0⤊ 0⤋