博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)
阅读量:4661 次
发布时间:2019-06-09

本文共 1484 字,大约阅读时间需要 4 分钟。

Biggest Number

解题思路:DFS(检索)+BFS(探路)=强剪枝

     一看就知道是搜索题,只是,要是DFS裸搜,真的会超时。时间,非常紧!

     做该题的时候,要无时无刻不忘剪枝,抓住一切剪枝的机会,剪吧!

(1)用flag记录当前检索的值与当前已经检索到的最大值的关系,一但有机会,就要剪掉那些检索到的值会比当前最大值要小的“残枝败叶”。

(2)每次DFS检索之前,一定要用BFS“探路”,要是该次检索的值的最大长度小于当前最大值的最大长度,赶紧剪掉。这次搜索到的值不可能比当前最大值大,搜了也白搜,赶紧结束,节约时间。

        这里我给出两个代码,一个是参考别人的代码注释来得,一种是用自己的想法从写得到的。   

首先,我承认自己做不出来,一直超时。但我是个锲而不舍的孩子,在网上查了资料,弄懂了。代码主人,只在博客中给出代码,没有思路描绘,也没有注释。我做了注释后的成果如下:

 

1532762 Accepted 0 KB 329 ms 4881 B 2013-09-03 20:55:11
#include
#include
#include
using namespace std;struct node{ int x,y;} queue[1000];int n,m;int Max,flag,tatal; //当前检索到的最大值的长度、当前检索值首数字与当前检索到的最大值的首数字的关系、数字总数char map[20][20]; //输入地图存储char ans[35],stack[35]; //当前检索到的最大值、当前检索值的情况int dir[4][2]= {-1,0,0,-1,0,1,1,0}; //四个方向bool yes(int x,int y){ return x>=0&&x
=0&&y
map[xx][yy]&&tatal==Max)continue; //当前检索的值不可能大于当前检索到的最大值【强剪枝4】 stack[cnt]=map[xx][yy]; //检索到的数字可用,加入到临时【当前检索值的情况】中 map[xx][yy]='#'; //记得标记哦,检索过的就不要再检索了 if(flag==0) //【】【】大小不确定 { if(cnt>=Max)flag=1; //长度,当前检索到的比较大 else if(ans[cnt]==stack[cnt])flag=0; //长度想相同就比首字母 【大小不确定】 else if(ans[cnt]
map[i][j])continue; //当前检索到的最大值,长度已达到最长&&开头数字比当前检索数字大 //以当前数字开头检索到的最大值肯定小于当前检索到的最大值【强剪枝1】 stack[0]=map[i][j]; map[i][j]='#'; //访问标记 if(ans[0]==stack[0])flag=0;//大小不确定 else if(ans[0]

 

原码转自:

本人代码:更新中。。。

 

转载于:https://www.cnblogs.com/suncoolcat/p/3301859.html

你可能感兴趣的文章