列印所有 n! 數字 1,2,3,...,n 的排列。
示例:輸入:3
輸出:1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
以下是我的方法。我的程式不適用于大于 3 的輸入。我理解它為什么不起作用的邏輯,但我無法將該邏輯轉換為代碼塊來解決該問題。
#include <stdio.h>
int permute(int n)
{
int a[n];
int i,j,k,store;
for(i=0;i<n;i )
a[i]=i 1;
for(i=1;i<=n;i )
{
for(j=0;j<n-1;j )
{
store=a[j 1];
a[j 1]=a[j];
a[j]=store;
for(k=0;k<n;k )
printf("%d ",a[k]);
printf("\n");
}
}
}
int main()
{
int n;
scanf("%d",&n);
permute(n);
return 0;
}
以下是 n 為 4 的輸出:
我們可以清楚地看到缺少一些排列,并且我確切地知道我的代碼中的錯誤。但我無法修復它。(我是初學者,因此我不太了解高級 C 庫或函式)

uj5u.com熱心網友回復:
一種解決方案是遞回呼叫函式:設定第一個數字(n可能的選擇),然后呼叫函式以獲取 size n-1。
輸出, 對于 n=4
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 3 2
1 4 2 3
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 3 1
2 4 1 3
3 2 1 4
3 2 4 1
3 1 2 4
3 1 4 2
3 4 1 2
3 4 2 1
4 2 3 1
4 2 1 3
4 3 2 1
4 3 1 2
4 1 3 2
4 1 2 3
#include <stdio.h>
#include <stdlib.h>
void swap (int *i, int *j) {
int temp = *i;
*i = *j;
*j = temp;
}
void permute(int index, int* arr, int n) {
if (index == n-1) {
for (int k = 0; k < n; k) {
printf ("%d ", arr[k]);
}
printf ("\n");
return;
}
for (int i = index; i < n; i ) {
swap (arr index, arr i);
permute (index 1, arr, n);
swap (arr i, arr index);
}
return;
}
int main()
{
int n;
if (scanf("%d",&n) != 1) exit (1);
int arr[n];
for (int i = 0; i < n; i) arr[i] = i 1;
permute(0, arr, n);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416417.html
標籤:
下一篇:在C中否定最大可能的負值
