问题求解策略及综合程序设计方案教学.ppt
《问题求解策略及综合程序设计方案教学.ppt》由会员分享,可在线阅读,更多相关《问题求解策略及综合程序设计方案教学.ppt(51页珍藏版)》请在三一办公上搜索。
1、第十一章 问题求解策略及综合程序设计,武汉大学计算机学院,主讲:谭成予,教 材:C程序设计导论,本讲重点,八皇后问题,问题定义:八皇后问题是一个著名而古老的问题。该问题要求在88的国际象棋棋盘上放置8个皇后,使得它们不能相互攻击,即任意两个皇后不能处于同一行、同一列或者同一斜线上。问有多少种放置的方案?,Q,j:行号 i:列号每行一个皇后,即每个j值对应一个i值。试探法,(1)j=1 i=1,Q,j:行号 i:列号每行一个皇后,即每个j值对应一个i值。试探法,(1)j=1 i=1,(2)j=2 i=3,4,8 i=3,Q,Q,j:行号 i:列号每行一个皇后,即每个j值对应一个i值。试探法,(1
2、)j=1 i=1,(2)j=2 i=3,4,8 i=3,Q,(3)j=3 i=5,6,7,8 i=5,Q,Q,j:行号 i:列号每行一个皇后,即每个j值对应一个i值。试探法,(1)j=1 i=1,(2)j=2 i=3,4,8 i=3,Q,(3)j=3 i=5,6,7,8 i=5,Q,(4)j=4 i=2,7,8 i=2,Q,Q,j:行号 i:列号每行一个皇后,即每个j值对应一个i值。试探法,(1)j=1 i=1,(2)j=2 i=3,4,8 i=3,Q,(3)j=3 i=5,6,7,8 i=5,Q,(4)j=4 i=2,7,8 i=2,(5)j=5 i=4,8 i=4,Q,(6)j=6 i无法
3、选取回退一步,Q,j:行号 i:列号每行一个皇后,即每个j值对应一个i值。试探法,(1)j=1 i=1,(2)j=2 i=3,4,8 i=3,Q,(3)j=3 i=5,6,7,8 i=5,Q,(4)j=4 i=2,7,8 i=2,Q,(6)j=6 i无法选取回退一步,(5)j=5 i=4,8 i=8,Q,j:行号 i:列号每行一个皇后,即每个j值对应一个i值。试探法,(1)j=1 i=1,(2)j=2 i=3,4,8 i=3,Q,(3)j=3 i=5,6,7,8 i=5,Q,(4)j=4 i=2,7,8 i=2,(5)j=5 i=4,8 i=4,Q,(6)j=6 i无法选取回退一步,(5)j=
4、5 i=4,8 i=8,(6)j=6 i无法选取回退一步,(4)j=4 i=2,7,8 i=7,依次类推,Q,j:行号 i:列号每行一个皇后,即每个j值对应一个i值。试探法,(1)j=1 i=1,(2)j=2 i=3,4,8 i=3,Q,(3)j=3 i=5,6,7,8 i=5,Q,Q,(4)j=4 i=2,7,8 i=7,依次类推,如何表示一具体方案,如何表示一具体方案?int queen8;queenj j=0,1,2,7;表示第j+1行皇后放在第queenj+1列上,即(queeni+1,j+1)放置一个皇后。,皇后放置问题,如何表示(queeni+1,j+1)放置一个皇后以后,与该皇后
5、同列、两个对角线不能再放置皇后?int b8,c15,d15;bj j=0,1,2,7;表示第j+1列上已有皇后如果第i+1行、第j+1列上放置一个皇后,则bj=1 第j+1列上已有皇后ci+j 主对角线上已有皇后di-j+7 从对角线已有皇后,算法描述,初始化棋盘为第1个皇后选择合适位置,第2步定义成一个递归函数tryvoid try(int i);该函数作用是放置第i+1个(i=0,1,7)皇后(第i+1行皇后放置):for(j=0;j8;j+)/*每个皇后都有8种可能位置*/2-1 如果不存在位置冲突,则 2-2 位置(i+1,j+1)上放置皇后 2-3 如果第8个皇后还没有放置好,则
6、继续放置下一个皇后/*try(i+1)调用*/否则 输出当前解 2-4 释放位置(i+1,j+1),#include int queen8,b8,c15,d15;int queennum=0;/*当前解的序号*/*找到一个解后,输出当前解*/void print()int k;queennum+;printf(%d:,queennum);for(k=0;k8;k+)printf(t%d,queenk);printf(n);,程序源代码,void try(int i)int j;/*每个皇后都有8种可能位置*/for(j=0;j8;j+)if(bj=0),int main()int k;/*数据
7、初始化*/for(k=0;k15;k+)if(k8)bk=0;ck=0;dk=0;try(0);/*从第1个皇后开始放置*/return 0;,主函数,本讲重点,集合运算,问题定义:假定一个全集合中有1、2到32这32个元素,任意给出两个集合,求它们的并集、交集和差集,并计算各个集合的势(即集合中元素的个数)。,数据结构,集合表示方法有:位向量、数组和树等本例使用位向量表示集合。一个位向量(1:n)表示集合,如果元素i在集合U中,则置SET(i)=1,否则为0。采用unsigned long 类型表示集合将unsigned long的32位从低到高位分别编号1、2到32,如果元素n在集合a中,
8、则将a的第n位置1,否则置0。例,集合1,2,32表示为二进制数10000000000000000000000000000011。为什么定义成unsigned类型而不是long 类型?因为考虑到在计算集合的势时需要用到位运算的右移运算符,为保证在右移时长整数的最高位始终补0所致,算法:假设集合a为1,2,14,则a用二进制数表示为:00000000000000000010000000000011集合b为3,14,24,31,则b用二进制数表示为:01000000100000000010000000000100#define UNION(x,y)(x)|(y)/*计算并集*/#define JI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 问题 求解 策略 综合 程序设计 方案 教学
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6038852.html