程序中的常用算法--经典排列算法
题目:将编号(1……n)n封信装入编号(1……n)n个信封,算出全部装错的情况,即全部装完后所有信封编号与信封内信的编号全部不同。
思考情景,编号为1的信可以装入编号2……n的信封。使用排列算法,使用count记录全部装错的情况。按照信封和信编号递增的顺序,每次都把一封编号不同的信装入一个空的信封,如果成功的装满n个信封。则使用count自增。
c语言代码如下
#include<stdio.h>
//记录所有可用情况个数
int count = 0;
//记录信的信封编号
int a[100];
//记录信封是否可以放入信
int b[100] = {0};
int main()
{
int n;
scanf("%d", &n);
int play();
play(1, n);
printf("%d\n", count);
}
int play(int k, int n)
{
int i,j;
//n封信全部都放入信封
if(k == n + 1)
{
printf("function:");
for(j=1; j<=n; j++)
{
printf("%d, ", a[j]);
}
printf("\n");
count ++;
return ;
}
//遍历n个信封
for(i=1; i<=n; i++)
{
//寻找可放入的信封编号,找不到就返回上一封信,换一个信封
if(i != k && b[i] == 0)
{
a[k] = i;b[i] = 1;
//找到下一封信
play(k+1, n);
b[i] = 0;//递归执行后,需要把信封置为可装入信封的状态
}
}
}