网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.C语言库函数(G类字母)-5.
.在CB中响应消息及自定义消息.
.全屏幕模拟时钟的C源程序.
.小型的文本编辑器(使用能通配符.
.井字棋游戏.不够完善.
.对C++中引用的补充说明(实例).
.魔方阵的另一种解法.
.在DBGrid中实现Copy、Paste功能.
.怎样在程序中利用C++支持多国语言.
.在VC++应用程序中实现颜色选择组.
.我的OLEDB SqlHelper.
.解决网爬工具爬取页面信息出现乱.
.深度探索C++对象模型(完结篇).
.Visual C++ 入门精解-引言.
.C++箴言:让=返回一个*this的引用.
.VC++编程隐藏计算机中的鼠标.
.C语言入门之函数(5).
.TCPIP完整的一套基础介绍.
.C语言入门之指针的慨念(1).
.学数学也要学点偷懒的技术(二).

关于全排列算法,大家请指导!

发表日期:2008-3-8


关于全排列算法,大家请指导! 我不知道大家有没有听说,明年起程序员考试就不分初,中,高级了,而我们软件专业明年就要过程序了,据说相当于考中程,或者还要难一些,虽然不知道消息的正确性,但这的确是我们的老师告诉我们的,所以老师就出一些题给我们练,下面是一道关于数学中全排列的算法的问题,编了我4天!真是的看起来轻易,编起来难..........下面给出我的源代码,并给大家解释我的思路: /***********************************************/
void chang(char str[],int m)  /*定义循环左移函数(我没有用左移函数)*/
 {
  int i,j;
  char temp=str[0];
  for (i=0;i<m;i++) str[i]=str[i+1];
  str[i]=temp;
 }
void pai(char str[],int m,int n) /*定义全排列函数*/
{
 int k;
 void chang(char str[],int m);
 if (m<n)        /* 定 义 递 归 调 用 出 口  */
  {
   for (k=0;k<=m;k++)
    {
     pai(str,m+1,n); /*递归调用*/
     chang(str,m); /*调用左移函数*/
    }
  }
 else printf("%s ",str);
}
#include "stdio.h"
main()
{char str[]="ABCD"; /*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/
clrscr();
pai(str,0,4); /*这里参数0(下标)表示从第一个元素开始,4表示元素个数(不是下标)*/
getch();
}
/*********************************************/ 下面我来解释一下,我花了近1天的时间,找到这样一个规律如下:
                           ┏ ABCD
                           ┣ BCDA
                 ┏ ABCD ━┫
                 ┃        ┣ CDAB
       ┏ ABCD ━╋ BCAD   ┗ DABC
       ┃        ┃         .
       ┃        ┗ CABD    .
ABCD ━┫                   .               
       ┃        ┏ BACD    .
       ┃        ┃         .
       ┗ BACD ━╋ ACBD   ┏ CBAD
                 ┃        ┣ BADC
                 ┗ CBAD ━┫
                           ┣ ADCB
                           ┗ DCBA
简化图如下所示 ==>
                     ┏ ABCD
                     ┣ BCDA
            ┏ ABC ━┫
            ┃       ┣ CDAB
    ┏ AB ━╋ BCA   ┗ DABC
    ┃      ┃        .
    ┃      ┗ CAB    .
A ━┫                .               
    ┃      ┏ BAC    .
    ┃      ┃        .
    ┗ BA ━╋ ACB   ┏ CBAD
            ┃       ┣ BADC
            ┗ CBA ━┫
                     ┣ ADCB
                     ┗ DCBA
大家看到了,以上就是一步一步循环左移就能得到所有全排列的数了.以上程序在Trubo C 2.0 中运行通过,假如大家还有什么疑问,请加我QQ:156301529,Email:rodgersnow@163.com,我们共同讨论.另外,我在想,假如是n个数或字符中取m个进行排列的话,该怎么改呢?目前正在考虑中,本人觉得难度很大,希望大家能帮帮我,请加我QQ,谢谢!
另附我在网上找到的经典全排列算法,叫"后补法",大家自己好好研究吧,在Trubo C 2.0 中运行通过了的.
#include <stdio.h>
void permutation(char a[], int m, int n)
{
int i;
char t;
if (m<n-1) {
permutation(a, m+1, n);
for (i=m+1;i<n;i++) {
t=a[m]; a[m]=a[i]; a[i]=t;
permutation(a, m+1, n); t=a[m]; a[m]=a[i]; a[i]=t;
}
} else
{
 printf("%s ", a);
}
}
int main() {
char a[]="ABCDE";
permutation(a, 0,5);
return 0;
}  

上一篇:关于C语言中图形模式的问题 人气:712
下一篇:C语言中的位域的使用 人气:1181
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐