n个数的全排列

来源:互联网 发布:网络协议本质论 pdf 编辑:程序博客网 时间:2024/06/09 23:03

基本实现

  • 递归实现
#include <stdio.h>void Swap(char *a, char *b){// 交换a和b    char temp = *a;    *a = *b;    *b = temp;}void Perm(char list[], int k, int m){ //生成list [k:m ]的所有排列方式    int i;    if (k == m) {//输出一个排列方式        for (i = 0; i <= m; i++)        putchar(list[i]);        putchar('\n');    }    else // list[k:m ]有多个排列方式    // 递归地产生这些排列方式    for (i=k; i <= m; i++) {        Swap (&list[k], &list[i]);        Perm (list, k+1, m);        Swap (&list [k], &list [i]);    }}int main(){    char s[]="123456789";    Perm(s, 0, 2);    return 0;}

这里写图片描述

应用

  • 求解 将1-9填入口口口+口口口=口口口,使得成立
#include <stdio.h>typedef int Element;int count;void Swap(Element *a, Element *b){// 交换a和b    Element temp = *a;    *a = *b;    *b = temp;}void Perm(Element list[], int k, int m){ //生成list [k:m ]的所有排列方式    int i;    if (k == m) {//判断一个排列方式            if(100*list[0]+10*list[1]+list[2]+100*list[3]+10*list[4]+list[5]==100*list[6]+10*list[7]+list[8]){                printf("%d%d%d+%d%d%d=%d%d%d\n",list[0],list[1],list[2],list[3],list[4],list[5],list[6],list[7],list[8]);                count++;            }    }    else // list[k:m ]有多个排列方式    // 递归地产生这些排列方式    for (i=k; i <= m; i++) {        Swap (&list[k], &list[i]);        Perm (list, k+1, m);        Swap (&list [k], &list [i]);    }}int main(){    Element number[]={1,2,3,4,5,6,7,8,9};    Perm(number, 0, 8);    printf("共有%d个",count/2);    return 0;}

这里写图片描述

0 0
原创粉丝点击