UVA 11882 Biggest Number (dfs搜索+bfs 剪枝)
来源:互联网 发布:淘宝朋友代付怎么查看 编辑:程序博客网 时间:2024/05/20 07:53
大体题意:
给你一个r*c的数字矩阵,要求从任意一个点开始走,只能上下左右走, 求走的过数连接起来最大是多少?
思路:
直接dfs每一个数字,在每一层dfs中,加上bfs 判断剩下的数连接起来能否大于当前的ans 不能的话 剪枝了。
虽然思路是这样的,但昨天一直TLE, 或许姿势不对,第二天重写了一遍 就好很多了= =
#include <cstdio>#include <cstring>#include <algorithm>#include <string>#define Siz(x) (int)x.size()using namespace std;const int maxn = 30 + 7;int anslen;string ans;int q[10000000 + 7], L, R;void camp(string& ss){ int len = Siz(ss); if (len > anslen) { ans = ss; anslen = len; } else if (len == anslen && ans < ss) ans = ss;}int n,m;char s[maxn][maxn];bool vis[maxn][maxn];const int dx[] = {1,-1,0,0};const int dy[] = {0,0,-1,1};bool bfs_vis[maxn][maxn];bool cmp(char& ch1,char& ch2){ return ch1 > ch2;}bool not_go(int &x_,int &y_,string &o){ L = R = 0; q[R++] = x_ * 100+y_; memset(bfs_vis,0,sizeof bfs_vis); bfs_vis[x_][y_] = 1; string tmp = o; while(L < R){ int oo = q[L++]; int y = oo%100; oo-=y; int x = oo/100; for (int i = 0; i < 4; ++i){ int xx = x + dx[i]; int yy = y + dy[i]; if (xx >= 0 && xx < n && yy >= 0 && yy < m && s[xx][yy] != '#' && !vis[xx][yy] && !bfs_vis[xx][yy]){ bfs_vis[xx][yy] = 1; tmp += s[xx][yy]; q[R++] = (xx*100+yy); } } } int len = Siz(tmp); if (len < anslen) return 1; else if (len == anslen){ int olen = Siz(o); sort(tmp.begin()+olen,tmp.end(),cmp); if (tmp <= ans) return 1; return 0; } return 0;}void dfs(int x,int y,string o){ if (anslen){ if (not_go(x,y,o)) return; } bool ok = 0; for (int i = 0; i < 4; ++i){ int xx = x + dx[i]; int yy = y + dy[i]; if (xx >= 0 && xx < n && yy >= 0 && yy < m && s[xx][yy] != '#' && !vis[xx][yy]){ vis[xx][yy] = 1; ok = 1; dfs(xx,yy,o+s[xx][yy]); vis[xx][yy] = 0; } } if (!ok){ camp(o); }}void init(){ anslen = 0; ans= "";}int main(){ while(~scanf("%d %d",&n, &m) && (n || m)){ for (int i = 0; i < n; ++i){ scanf("%s",s[i]); } init(); for (int i = 0; i < n; ++i){ for (int j = 0; j < m; ++j){ if (s[i][j] != '#'){ memset(vis,0,sizeof vis); vis[i][j] = 1; string a = ""; a += s[i][j]; dfs(i,j,a); } } } printf("%s\n",ans.c_str()); } return 0;}/**3 7##9784###123####45###0 0791452384**/
0 0
- UVA 11882 Biggest Number (搜索+剪枝(dfs+bfs))
- UVA 11882 Biggest Number (dfs搜索+bfs 剪枝)
- UVa 11882:Biggest Number(DFS+剪枝)
- 【搜索+强剪枝】UVA-11882 - Biggest Number
- 11882 - Biggest Number(DFS + 剪枝)
- Uva11882 Biggest Number 【dfs回溯+bfs剪枝】【习题7-15】
- Biggest Number(刘汝佳,搜索+剪枝)
- 第六届湖南省省赛 Biggest Number(DFS+BFS,巧妙剪枝)
- nyoj 667 Biggest Number 搜索 减枝 dfs bfs
- UVA-11882 bfs + dfs + 剪枝
- uva 11882Biggest Number
- UVA 11882Biggest Number
- Uva 11882 Biggest Number (IDA*)
- UVA 11882(p218)----Biggest Number
- uva Biggest Number UVA
- UVA11882 Biggest Number 强剪枝
- Biggest Number UVA
- Biggest Number UVA
- 25、VS2012中给C++的main函数传递参数
- 395. Longest Substring with At Least K Repeating Characters
- docker -- Namespace资源隔离
- 从“用户访问网页”实例看互联网协议的运作
- hiho一下 第一百三十四周 #1468 : 2-SAT·hihoCoder新春晚会 【2-SAT 之 枚举--搜索】
- UVA 11882 Biggest Number (dfs搜索+bfs 剪枝)
- #cs231n#相关资源
- 析构函数
- 机器学习之先验分布,后验分布,共轭先验分布
- SSH框架搭建
- strip 用法
- Java 流(Stream)、文件(File)和IO
- react-webpack 照片墙制作(二)
- poj 1511 spfa 模板题