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