Re: [課程] 11/18 C2010 助教課預定內容

作者: pp5438 (QQ)   2010-11-18 19:18:47
在這裡跟大家說抱歉 為了避免誤導大家 這份code和上課時用的稍微不一樣
改的地方是註解以及終端條件的i+1->i
還有 for(j=0;j<n;j++)
被我改成 for(j=1;j<=n;j++)
另外
助教在上課的時候有說過一個練習
就是寫一個程式:
輸入2
輸出
1 1
1 2
2 1
2 2
從這個程式只要稍微改一點點就可以達到上面這個練習的目標
大家可以試試看
==============================================================================
輸入一個數字N
輸出1~N的所有排列
example:
input: 4
output:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
=============================== Code ==========================================
#include<stdio.h>
void combination(int i,int n,int array[],int used[])
{
int j;
if(i==n) // 終端條件 表示位數 0 ~ N-1 都已經猜完了
// 並且猜測結果間都沒發生衝突
{
for(j=0;j<n;j++) printf("%d ",array[j]);
printf("\n");
return;
}
for(j=1;j<=n;j++) // 猜測第i位的值是j
{
if(used[j]==1) continue; // 檢查j是否有被之前某一層遞迴用過
array[i]=j;
used[j]=1;
combination(i+1,n,array,used);
used[j]=0;
}
return;
}
int main()
{
int n,i;
int array[20];
int used[20];
while(1)
{
scanf("%d",&n);
if(n==-1) break;
// 如果輸入-1 則離開while 跳出程式
for(int i=1;i<=n;i++) used[i]=0;
combination(0,n,array,used);
// 從第0這一個位數開始猜 直到第n-1位
}
return 0;
}

Links booklink

Contact Us: admin [ a t ] ucptt.com