有一天mirror58229提起一道dfs题 还是我们学校oj的,她说写的很麻烦 我就凑过去看,啊!这么标准的dfs究竟哪里会麻烦了呢? 。 。 。 。 于是就自己写了。。。 真的好麻烦啊!!! TLE到WA到TLE。。。。 去网上搜题解都说要dfs走一步bfs一下,奶奶的好麻烦啊!! 我就是不想写bfs啊!!! 另外一个方法(当前结果已为最长,若此时搜索的第一个字比当前结果的第一个字小的话直接不搜)这个方法倒是不错,当然加进自己的代码后依旧超时 于是不干了 今晚mirror给了我数据,跑了一下还真的停慢的。。。 也知道自己wa哪里了。。。。 总之讲讲我的剪枝法吧: 1、先对输入的数字进行从大到小排序,若一个数字搜索完结果的长度是最大可能的话,就不继续搜比它更小的数字了 2、在dfs的过程中对当前的串进行比较,若到目前为止它已经比结果来得小也就不继续搜索了 反正这样剪剪就过了。。。。跑了320ms自己还以为挺快的 然后顺便搜了一下别人的情况。。。 天哪。。。。80ms的是怎么写出来的 简直是在做电子实验的时候才会用的单位吧。。。。 顺带一提这家伙好像是我开始做刘汝佳紫书的时候和我一起开始写的。。。。 因为每次我刷紫书的题的时候都会看到他在我附近的时间点提交的。。。。 刚开始的时候是差不多。。。。 有时提交完会发现几分钟前他也在提交 后来。。。。 然后发现他比我早了几天A。。。。 然后是早了几周A。。。。。。。。。 然后是早了几个月A。。。。。。。。。。 再之后就没有关注他了。。。 没想到会在今天再次看到这个id,居然已经刷到第七章了。。。。 哎。。。。膜拜之 贴一下这人的github和vj页面 github vj 代码:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <stack> using namespace std; const int maxn = 45; int dx[4] = {0,0,1,-1}; int dy[4] = {1,-1,0,0}; char now[maxn],res[maxn],save[16][16]; int r,c,p; bool judge[maxn][maxn],flag; bool compare(char *a,char *b){ if(strlen(a)>strlen(b)){ return true; }else if(strlen(a)<strlen(b)){ return false; }else{ int len = strlen(a),i; for(i=0;i<len;i++){ if(a[i]>b[i]){ return true; }else if(b[i]>a[i]){ return false; } } } return false; } bool wtf(char *a,int len,char* b){ int i; for(i=0;i<len;i++){ if(a[i]>b[i]){ return true; }else if(b[i]>a[i]){ return false; } } return false; } void dfs(int x,int y){ int i,len = (int)strlen(now)+1; if(flag&&wtf(res,len-1,now)){ return; } now[len-1] = save[x][y]; judge[x][y] = false; bool killme = true; for(i=0;i<4;i++){ int nx =x+dx[i],ny = y+dy[i]; if(nx>=1&&nx<=r&&ny>=1&&ny<=c&&judge[nx][ny]&&save[nx][ny]!='#'){ dfs(nx, ny); killme = false; } } if(killme){ if(compare(now, res)){ memcpy(res,now,sizeof(now)); if(len==p){ flag = true; } } } now[len-1]='\0'; judge[x][y] = true; return; } struct unit{ pair<int, int> postion; int number; }; bool comparePoint(unit a,unit b){ return a.number>b.number; } unit point[maxn]; int main(){ int i,j; while(~scanf("%d%d",&r,&c)){ if(r==0&&c==0){ break; } p=0; for(i=1;i<=r;i++){ for(j=1;j<=c;j++){ cin>>save[i][j]; if(save[i][j]!='#'){ point[++p].postion = make_pair(i, j); point[p].number = save[i][j] - '0'; } } } res[0] = '\0'; now[0] = '\0'; flag = false; sort(point+1, point+1+p, comparePoint); point[0].number = point[1].number+1; for(i=1;i<=p;i++){ memset(judge, true, sizeof(judge)); if(flag&&point[i].number<point[i-1].number){ break; }else{ dfs(point[i].postion.first, point[i].postion.second); } } printf("%s\n",res); } return 0; }