砷收函肚追沪栈趋蛰翘广得亮床耗厨削寐慢辅哀敬愉逾澳沸撂明山戴秉蒂北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题求解与程序设计第七讲搜索李文新2004.2–2004.6读孩蟹蔓老涟进缅虑孵分美猎贪医饱澡庇埋娱缘锄熬倾信萝细蕾银枪募超北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7内容提要搜索讨论1011stick讨论1054thetroublesomefrog参考王知昆的冬令营报告作业屡关御嘿那坐靡棘症轿亚亨旧室卉很贷密楚恤瘩磁荷戳忍幌遮互抵固烘剪北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7搜索的一般概念在解空间中尝试所有可能,找出满足条件的取值回顾填数游戏:1-9填在3*3的表格中,使得行、列、对角线的和均为15。•方程组•搜索–逐一尝试+剪枝读乙编饼柑君或亏伎灶借诵耸醚瘟让诺锅瀑贱澜晃辜魏毒儿严牌事沿芬蛤北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7题目讨论1011stick选篓赏俱苞昆贸号硕臼粪扭曙捍武昔橙煞厌赦质贼诚酝程扎蛾拾虑漓腐纸北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7题目讨论TheTroublesomeFrogIOI2002day1task1阻秽齿侨毅苫帧糕刑瓜攒吐哑读杏绎旁快毯座赂喝哑负歉部姥堵铲厌枚壤北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题稻田费枝牛拧沁苗屋毡噪醇许碳臀紊活渺泌俗篷鸳增狙击款露尤边媚相姬韩涕北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题青蛙从外面跳入稻田,踩过一些禾苗,后,跳出稻田。封函置丧窑旷链邦躇枝咋晤淳像篷徐焚劫矢要丘掐回兆饰准哆熏账避请摹北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题蛙路:一个方向,等间距,大于等于3个点不同蛙路:可以方向不同,间距不同缸甜忧讹柴茅描乓砍乏友裳未蚀阜年秸镶药谈籍辜风砂孕耗鞘淬粘赤望娠北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题许多青蛙跳过稻田,形成多条蛙路,不同蛙路可以踩过同一作物。解往纂始鸣玩毫舰葡汇篆孵璃梧驻牧那窒邹阀饮愚棠霖舀掣树页鸟啮除凰北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题青蛙每天早上踩坏稻田,早上人们发现稻田有若干株作物被踩坏,但不知多少青蛙来过。也有不在蛙路上的被踩坏的作物。僚柜匡绑级尧河乏杀绪展素畦篆坊最噬妇蹲罚驳帐拆整仕货赌陌誊架羊摔北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题问,给定一块被踩坏的稻田,求可能的最长的蛙路上被踩坏的作物的数目。过筋剪驭祖义礁配校面癌思驭妊徽烦捧阀矛赎诺耘烹烟池杨窥碑沪怨慌仙北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7输入第一行整数R和C,稻田的行数和列数第二行整数N,表示被踩坏的作物总数。后续N行,每行两个整数i,j为被踩坏的作物的行和列的位置:1=i=R,1,1=j=C。每个被踩坏的作物只出现一次。绒啡碧羔俱逢肪维腑泪吐凶谣鲜概茂廖向侨儡经玲胃贮魂碑蜘朔眼掐岁慢北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7输出单个整数--表示最长可能蛙路上踩坏的作物数目袱结捧烹屉钾袁雄踌瞪搅仿嫌包胰肇侍娩院疗焊辣为戒哮泽嗓神妖育艺战北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7样例Figure-4彦账瑟添剧珐闸氢附辐魔舟眼峪刻赔将饯扼测躬聂以疹看现傀虚辖龋搁刘北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题的解这道题目也就是说,在给出的n个点中找出一些点的序列来,使得每一个点相对于上一个点的坐标都是一个相同的向量,且第一个点减去这个向量和最后一个点加上这个向量后均落在方格的外面。竿雾苏睦雇糖僻位衰疟他祭颊候亥绿授逝汐叼耸锦慌搞帕奖构腹渡默晦巢北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题的解我们先对这些点按照坐标排序。然后依次循环出要求的序列中的第一个和第二个点,这样我们就知道后一个点相对于前一个点的坐标是多少了。然后我们依次用第二个点加上这个坐标的出第三个点,第三个点加上这个坐标得出第四个点等等。当然,我们还需要判断一下这求出来的第三个、第四个点是否在给定的点内。胺往烂秘遭梅热摈皆荐探钙壳孤龋牛警鹰苫槐益涸淆慑孔午桨裸奥拧淡最北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题的解由于每个点的上一个点/下一个点最多只能有n种选择,故一个点最多属于n条不同的蛙路。这样,对于某个确定的点来说,它的所有可能的下一个需要判断的点至多有n个。这样因为判断一个点在不在给定的点内只需要O(1)的复杂度,所以我们只需要O(n2)的时间就可以得出问题的解答。由于这个算法需要一个r*c的表来保存点在方格中的存在状态,故空间复杂度为O(n2)。邓姨琵户寒颤编惹涡症红顺瞬奔图变纹靠床盖笺贸聪肆彤观尔攘芜卫筑晋北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7问题的解需要注意的是,蛙路中的点数少于3个的时候是不考虑的。所以这个时候的蛙路中的点数应该按照0来算。沉杠患蛔颊淘枷吵尼曝踩烹违剖莉陆居磋亥彩堰稼恭焙浦押羚舆仙叶婉妒北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7实现细节Frogvsfrog’平面上点的表示Frog2–0有冗余代码Frog2–1去掉冗余Frog2–2compare判断Frog2–3改变表达式写法Frog2–4增加剪枝Frog2–5不太好的剪枝顺序Frog2–6较好的剪枝顺序辞烽坷仗全推带赔凹茵北亿缮诛凤塔抿娘庸曳陕世靶乞影杆捉励胖蝶京魂北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7测试数据No.N,(R*C)DescriptionSolution118,(6*7)Sampledatainthetaskdescription4210,(10*10)Manuallydesigned5325,(50*50)Manuallydesigned13450,(10*10)SeveralLines+randompoints105100,(20*20)modifiedrandompointset106300,(30*30)modifiedrandompointset157500,(55*55)SeveralLines+randompoints288500,(100*100)Specialcasefornosolution091000,(100*100)SeveralLines+randompoints34101000,(1000*1000)SeveralLines+randompoints250112000,(50*50)Random(uniform)points25122000,(100*200)SeveralLines+randompoints33132000,(1000*2000)SeveralLines+randompoints333犁臃零戌儡膏挠黔要闸雀氨伦豢钓矣豺院瓤敛就绷存愧帧澈岛栋弯橡牢刃北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7测试数据143000,(60*60)Uniformlyrandompoints31153000,(500*500)Xshapesandrandompoints500163000,(5000*1)Horizontalline20173000,(5*1000)SeveralLines+randompoints17184000,(100*100)Randompoints(uniformly)34194000,(200*20)Verydensepointsset200204000,(1000*1000)SeveralLines+randompoints500214000,(5000*5000)SeveralLines+randompoints311225000,(100*100)Chessboardstyle100235000,(1000*1000)SeveralLines+randompoints334245000,(3000*3000)Irregularlinearpoints1000255000,(5000*5000)Modifiedrandompoints72梧寝瓤旁疏石高充逗粳胸快嚏鹏咆悟矣巧电枯糜扰娶支搔水迪瞬浑振陷哀北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7参考资料王知昆的冬令营报告翼紊惹仔酶稗究乃肤握靡立郡烷两梅渗疲申时阂询孟租聊泌娄依挎弊蚀潮北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7作业10111054选做完吧瓮星关机撕聂薄涧恤巫车甚通摩拎冷谜蛀签矿析尸拱胚英狂笆驹氧睡北京大学ACM国际大学生程序设计竞赛课件7北京大学ACM国际大学生程序设计竞赛课件7