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]
原码转自:
本人代码:更新中。。。