已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计培训之5: 搜索算法,袁辉勇 2010年4月20日,一个从起始状态到达目标状态包含多步操作,而每一步操作又有几种可能,只有正确的操作才能达到目标(如八皇后问题),这样的问题可以看做是一个树。 如果按照1-2-4-5-3-6-7的顺序,叫深度优先(dfs) 如果按照1-2-3-4-5-6-7的顺序,叫广度优先(bfs),一、概述,void dfs(int k) /处理第k步 if (k=n) /已经处理到第n步,到达目的状态 输出结果 else /处理第k步 for (int i=1; i=m; i+) /第k步中有m种可能 处理第k步 dfs(k+1);/进入第k+1步 ,二、深度优先(dfs)模板1:,输出1-m个数中取n个数的所有多重排列。例如n=2,m=3的所有多重排列为: 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3,例1:多重排列问题,/从1到m中取n个数,允许重复取数 #include using namespace std; int n,m, a10; void dfs(int k) if (k=n) for (int i=0; imn; dfs(0); return 0; ,输出1-m个数中取n个数的所有排列。例如n=2,m=3的所有排列为: 1 2 1 3 2 1 2 3 3 1 3 2,例2:排列问题,/从1到m中取n个数,不允许重复取数 #include using namespace std; int n,m, a10; bool bz10; void dfs(int k) if (k=n) for (int i=0; imn; dfs(0); return 0; ,/从1到m中取n个数,不允许重复取数,即排列方法2 #include using namespace std; int n,m, a10; void dfs(int k) if (k=n) for (int i=0; imn; for (int i=0; im; i+) ai=i+1; dfs(0); return 0; ,输出m个数中取n个数的所有组合。例如m=5,n=3的所有组合为: 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5,例3:组合问题,#include using namespace std; int m,n,a10; /存放每个数 void comb(int k) if ( kn ) for (int i=1; i=n;i+)printf(“%5d“,ai); printf(“n“); else for (int i=ak-1+1; i=m-n+k; i+) ak=i; comb(k+1); int main( ) scanf(“%d%d“, /从第1个数开始 ,void dfs(int k) /处理第k步 for (int i=1; i=m; i+) /第k步中有m种可能 处理第k步 if (k=n) /已经处理完n步,到达目的状态 输出结果; return; dfs(k+1);/进入第k+1步 ,二、深度优先(dfs)模板2:,输出1-m个数中取n个数的所有多重排列。例如n=2,m=3的所有多重排列为: 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3,例1:多重排列问题,/从1到m中取n个数,允许重复取数 #include using namespace std; int n,m, a10; void dfs(int k) for (int i=1; imn; dfs(0); return 0; ,输出1-m个数中取n个数的所有排列。例如m=3 ,n=2的所有排列为: 1 2 1 3 2 1 2 3 3 1 3 2,例2:排列问题,/从1到m中取n个数,不允许重复取数 #include using namespace std; int n,m, a10; bool bz10; void dfs(int k) for (int i=1; imn; for (int i=0; im; i+) ai=i+1; dfs(0); return 0; ,/从1到m中取n个数,不允许重复取数 #include using namespace std; int n,m, a10; void dfs(int k) for (int i=k; imn; dfs(0); return 0; ,输出m个数中取n个数的所有组合。例如m=5,n=3的所有组合为: 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5,例3:组合问题,#include using namespace std; int m,n,a10; /存放每个数 void comb(int k) for (int i=ak-1+1; in ) for (int i=1; i=n;i+) printf(“%5d“,ai); printf(“n“); return; comb(k+1); int main( ) scanf(“%d%d“, /从第1个数开始 ,/使用数组queue 存放结点队列 void bfs( ) head=0; tail=1; queuehead=首结点的值; while (headtail) /队列不空 temp=tail; for (k=head; k=tail; k+) /对当前层扩展 if ( 到达目的状态 ) 输出结果; return; for (i=1; i=m; i+) /每个结点的m种扩展可能 if (可以扩展) 处理每种可能情况; queuetemp+=扩展出的结点值; head=tail; tail=temp; ,三、广度优先(bfs)模板1:,/使用数组queue 存放结点队列 void bfs( ) head=0; tail=1; queuehead=首结点的值; while (headtail) /队列不空 if ( 到达目的状态 ) 输出结果; break; head+; for (i=1; i=m; i+) /结点head的m种扩展可能 if (可以扩展) 处理每种可能情况; queuetail+=扩展出的结点值; ,四、广度优先(bfs)模板2:,/使用stl中的队列 void bfs( ) 首结点入队列q; while ( ! q.empty()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026福建漳州高新区区属国有企业招聘工作人员48人备考题库附答案详解(能力提升)
- 2026黑龙江绥棱县事业单位招聘16人备考题库附答案详解(综合题)
- 2026广东清远市佛冈县石角镇招聘专职网格员10人备考题库附答案详解(突破训练)
- 2026春季江西铜业集团有限公司永平铜矿校园招聘9人备考题库附答案详解(考试直接用)
- 2026江苏省交通技师学院招聘高层次人才4人备考题库含答案详解(培优)
- 2026四川宜宾江安县扶残助残协会社会招聘办公文员2人备考题库含答案详解ab卷
- 2026海南椰岛(集团)股份有限公司招聘备考题库含答案详解(考试直接用)
- 2026四川省国有资产经营投资管理有限责任公司招聘1人备考题库及一套参考答案详解
- 2026江苏南京大学马克思主义学院博士后1人备考题库(含答案详解)
- 2026云南曲靖市宣威市科学技术协会面向社会招聘公益性岗位3人备考题库及答案详解(历年真题)
- 《年历、月历中的信息》教案-2025-2026学年苏教版小学三年级数学下册
- GB/T 20631.2-2006电气用压敏胶粘带第2部分:试验方法
- 知行合一读书分享课件
- 朔黄铁路公司营业线施工安全管理实
- 山地回忆-完整版获奖课件
- 绿色食品从土地到餐桌全程课件
- DB11T 716-2019 穿越既有道路设施工程技术要求
- “挑战杯”基本财务报表范文
- 凯恩帝K1TBIII数控系统说明书
- 新概念英语人名地名及音标
- 年产250万吨合格连铸坯的炉外精炼系统设计
评论
0/150
提交评论