[理学]C语言基础_简单数据结构_acm入门_第一讲_搜索.ppt

[理学]C语言基础_简单数据结构_acm入门_第一讲_搜索.ppt

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[理学]C语言基础_简单数据结构_acm入门_第一讲_搜索

* 跳马规则 a b c d e f g h 1 2 3 4 5 6 7 8 在2×3的矩形里: * 例如:从a1到e4 当目标出现在所扩展出的结点里,结果就找到了。 To get from a1 to e4 takes 3 knight moves. a b c d e f g h 1 2 3 4 5 6 7 8 0 3 3 2 1 3 2 2 3 1 2 3 3 2 2 3 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 2 * * * 双向BFS a b c d e f g h 1 2 3 4 5 6 7 8 0 2 1 2 2 1 2 1 2 2 2 1 1 1 1 2 0 1 2 从起点、终点同时开始 双向BFS,有效地提高了时空效率。 从起点找2步能跳到的点 从终点找1步能跳到的点 * POJ 1745 Divisibility 输入N、K,然后输入N个整数,N个整数可列出若干加减运算式;若存在一个算式,它的值能被K整除,输出“Divisible”,否则输出“Not divisible”. 输入: 2 4 7 17 5 -21 15 4 5 17 5 -21 15 输出: Divisible Not divisible * {17,5,-21,15} 17 5 5 -21 -21 -21 -21 15 15 15 15 15 15 15 15 + + + 17 + 5 + -21 + 15 + + + + - - - - - - - 17 - 5 + -21 - 15 * 最坏情况N=10000,二叉树有10000层,结点总数210000-1。不可能枚举所有表达式 本题的目标:判断叶子结点上是否有值能被k 整除=判断是否有值,除以k的余数为零。 计算中间值取余,不影响结果。 (a + b) % k = ( a % k + b % k) % k 因此只需记录对k的余数。2=k=100,每层结点最多100个,不是指数级增加。 * 4 7 17 5 -21 15 每层最多7个结点 (定义数组): 首先加入起点,17 % 7 = 3 扩展第2层结点 (3+5) % 7 = 1 (3 – 5 + 7) % 7 =5 1 2 3 4 5 6 0 + - 扩展第3层结点 (1+ -21) % 7 = 1 (1 – -21) % 7 = 1 (5+ -21) % 7 = 5 (5– -21) % 7 = 5 1 2 3 4 5 6 0 扩展第4层结点 (1+ 15) % 7 = 2 (1 – 15) % 7 = 0 (5 + 15) % 7 = 6 (5 – 15) % 7 = 4 1 2 3 4 5 6 0 1 2 3 4 5 6 0 * 例3 Holedox Moving 一条长度为L“贪吃蛇”在n*m的迷宫中,求它走到出口(1,1)的最少步数。 (2≤L ≤ 8;1n,m ≤ 20) 输入: 5 6 4 4 1 4 2 3 2 3 1 3 2 3 3 3 3 4 0 0 0 输出: Case 1: 9 * 蛇头在上、下、左、右四方向上的探索过程 注意: 蛇不能出界, 不能撞自己, 不能撞石头。 * 例4:Eight 八数码游戏 Input: 2 3 4 1 5 x 7 6 8 Output: ullddrurdllurdruldr * 八数码问题的广度优先搜索 * 分析:所给输入为初始状态,终态是1 2 3 4 5 6 7 8 x。 将x当作9,开一个数组a[9!],存每种状态 采取双向BFS,前后搜同时进行。 初始时每种状态标记为0. 在数组a里查找从前边搜到的状态,标记是0, 则置标记为1;标记是-1,则说明这是个前后搜重合状态,同时说明input有解。 在数组a里查找从后边搜到的状态,标记是0,则置为-1;标记是1,则也说明这是个前后搜重合状态,同时说明input有解。 谢谢观看 * #includeiostream #define MAX 100 int map[MAX][MAX]; int n; int cnt; int ok(int a,int b) { int tmpA=a,tmpB=b;//暂存变量 int i; for(i=0;in;i++){//验证行或列是否有重的 if(map[i][a]||map[b][i])return 0; } while(tmpA0tmpB0){//验证左斜上是否有 tmpA--;tmpB--; if(map[tmpB][tmpA])return 0; } tmpA=a;tmpB=b; whi

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档