- 1、本文档共47页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
南邮ACM程序设计基础(2010级第6讲)最新
ACM程序设计基础 班 级 :仙林校区2010级选修同学 任课教师 :陈 志 上课地点和时间 理论:教2-413 :星期2 (18:30开始) 实践:(仙林)计算中心 本周实验(竞赛)通知 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 第6讲:问题求解(二) 结束语:现状 结束语:现状 结束语:措施 结束语:规划 结束语 6.3 数学类方法 猴子选大王:递推 递推公式 f[1]=0; f[i]=(f[i-1]+m)%i; (i1) #include stdio.h int main() { int n, m, i, s; while(scanf(%d%d, n, m),0!=m){ s=0; for (i=2; i=n; i++) s=(s+m)%i; printf (%d\n, s+1); } } 6.3 数学类方法 高等数学(算法基础) 数论 组合数学 计算几何 博弈论 概率论 6.4 回溯法:迷宫 6.4 回溯法:Eight queens puzzle(8皇后问题) 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题,同时也是经典递归算法例题。 该问题是十九世纪著名的数学家高斯1850年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。 6.4 回溯法:Eight queens puzzle(8皇后问题) Q Q Q Q Q Q Q Q 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 6.4 回溯法:Eight queens puzzle(8皇后问题) 第一种方法:枚举法(纯) 从64个格子中选一个子集,使得“子集中恰好有8个格子,且任意两个选出的格子都不在同一行、同一列或同一个对角线上”。 子集有264个 6.4 回溯法:Eight queens puzzle(8皇后问题) 第二种方法:组合生成问题(组合数学) 从64个格子中选8个格子。 有 =6.426×109种方案 6.4 回溯法:Eight queens puzzle(8皇后问题) 第三种方法:全排列生成问题 8皇后问题可以表示为8-元组(x1,…,x8) ,其中xi是放置皇后i所在的列号。 显式约束条件是si={1,2,3,4,5,6,7,8}, 1≤i≤8 隐式约束条件是,没有两个xi可以相同且没有两个皇后可以在同一条斜角线上。 8!= 40320个 6.4 回溯法:Eight queens puzzle(8皇后问题) 第三种方法:全排列生成问题 void print_permutation(int n, int cur) { int i, j; if(cur == n){ for (i = 0; i n; i++) if(i) printf( %d, A[i]); else printf(%d, A[i]); printf(\n); } else for(i=1; i=n; i++) { int ok = 1; A[cur]=i; for(j=0;jcur;j++) if(A[j] == A[cur]){
文档评论(0)