博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言-回溯例3
阅读量:7254 次
发布时间:2019-06-29

本文共 1907 字,大约阅读时间需要 6 分钟。

               排列问题

1、实现排列A(n,m)

对指定的正整数m,n(约定1<m<=n),具体实现排列A(n,m)。
2、 回溯算法设计
设置一维数组a,a(i)(i=1,2,…,m)在1—n中取值。首先从a(1)=1开始,逐步给a(i)(1≤i≤m)赋值,每一个a(i)赋值从1开始递增至n。
为判断数字是否重复,设置中间变量g:先赋值g=1;若出现某两数字相同(即a(i)=a(j)),则赋值g=0(重复标记)。
若i=m与g=1同时满足,则为一组解,用s统计解的个数后,格式打印输出这组解。
若i<m 且g=1,表明不到m个数字,下一个a(i)从1开始赋值,继续。
若a(i)=n ,则返回前一个数组元素a(i-1)增1赋值。直到a(1)=9时,已无法返回,意味着已全部试毕,求解结束。

3、算法描述

输入正整数n,m,(n≥m);
i=1;a[i]=1;
while (1)
{ g=1;for(j=1;j<i;j++)
  if(a[j]==a[i] ) g=0;    /* 检测,不满足返回 */
  if(g && i==m)
     printf(a[1-m]);       /* 输出一个解 */
  if(i<n && g) {i++;a[i]=1;continue;}
  while(a[i]==n && i>1) i--;   /* 回溯 */
  if(a[i]==n && i==1) break;  /* 退出循环,结束 */
  else a[i]=a[i]+1;
}

4、代码实现

1 #include 
2 #include
3 4 int main() 5 { 6 int a[100]; 7 int num; 8 int flag; 9 int i,j,k;10 int m,n;11 printf("输入n(A(n,m)):");12 scanf("%d",&n);13 printf("输入m(A(n,m)):");14 scanf("%d",&m);15 i=1;16 a[i]=1;17 num=0;18 while(1)19 {20 flag=1;21 for(k=i-1;k>=1;k--)22 {23 if(a[i]==a[k])24 {25 flag=0;26 }27 }28 if(flag&&i==m)29 {30 num++;31 for(j=1;j<=m;j++)32 {33 printf("%d",a[j]);34 }35 printf(" ");36 if(num%6==0)37 {38 printf("\n");39 }40 }41 if(flag&&i
1)i--;48 if(a[i]==n&&i==1)49 {50 break;51 }52 else53 {54 a[i]++;55 }56 }57 printf("\n排列数A(%d,%d)=%d",n,m,num);58 return 0;59 }

运行结果:

5、扩展

(1)把以上程序中的输出语句printf("%d",a[j])改为printf("%c",a[j]+64);排列(或组合)输出由前n个正整数改变为前n个大写英文字母输出。

运行结果:

(2)把以上程序中的输出语句printf("%d",a[j])改为printf("%c",n+65-a[j]);排列(或组合)输出由前n个正整数改变为前n个大写英文字母逆序输出。

运行结果:

转载于:https://www.cnblogs.com/xiaojingang/p/3746836.html

你可能感兴趣的文章
[裴礼文数学分析中的典型问题与方法习题参考解答]4.5.10
查看>>
设计模式(十四)单例模式(创建型)
查看>>
JAVA修饰符类型(public,protected,private,friendly)
查看>>
haxm intelx86加速模拟器的安装
查看>>
(ETW) Event Tracing for Windows 入门 (含pdf下载)
查看>>
OSSEC
查看>>
我的前端学习历程
查看>>
Linux Module
查看>>
jquery 自定义click事件执行多次
查看>>
计划给予心脏公式
查看>>
[leetcode]3 Sum closest
查看>>
Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载
查看>>
java Long的iniValue出错
查看>>
Cocos2d-x3.0下一个 Lua与C++打电话给对方
查看>>
伪装隐藏Nginx,PHP版本号提升服务器安全性
查看>>
Linux硬盘的检测(原创)
查看>>
git恢复被修改的文件
查看>>
Javascript Math.ceil()与Math.round()与Math.floor()区别
查看>>
XCode5添加新建类模板(Cocos2dx Template Class for Scene or Layer)
查看>>
SQL Server窗口函数:ROWS与RANGE
查看>>