Biggest Number UVA
来源:互联网 发布:禁忌搜索算法模拟 编辑:程序博客网 时间:2024/05/20 06:04
比较简单的一道搜索的题目,从有数字的位置开始,分别向上下左右四个方向进行搜索,搜索的同时记录已经访问的数字串,并且记录当前已经使用的数字串的个数,计算出还可能使用的数字串的个数,如果两者之和小于已经保存的最优的结果的长度,那么就直接返回,如果长度相等,那么就对字符串进行比较,如果小于,那么也就直接返回。具体实现见如下代码:
#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>#include<functional>using namespace std;const int maxn = 25;int R, C;char area[maxn][maxn];bool vis[maxn][maxn], vis2[maxn][maxn];int dx[] = { 1, -1, 0, 0 };int dy[] = { 0, 0, 1, -1 };string ans;typedef struct node{int x, y;}node;int getRemain(int cur_x,int cur_y){queue<node> q;node start;start.x = cur_x, start.y = cur_y;memcpy(vis2,vis,sizeof(vis));q.push(start);int amount = 0;while (!q.empty()){node t = q.front();q.pop();for (int i = 0; i < 4; i++){int newx = t.x + dx[i];int newy = t.y + dy[i];if (newx >= 0 && newx < R&&newy >= 0 && newy < C&&!vis2[newx][newy]&& area[newx][newy] != '#'){node temp;temp.x = newx, temp.y = newy;vis2[newx][newy] = true;q.push(temp);amount++;}}}return amount;}void update(string s){int length1 = s.size(), length2 = ans.size();if (length1 > length2 || (length1 == length2&&s>ans))ans = s;}void dfs(int step,int cur_x,int cur_y,string st){int remain=getRemain(cur_x,cur_y);if (step + remain < ans.size()) return;if (step + remain == ans.size() && (st + "z") < ans) return;update(st);for (int i = 0; i < 4; i++){int newx = cur_x + dx[i];int newy = cur_y + dy[i];if (newx >= 0 && newx < R&&newy >= 0 && newy < C&&!vis[newx][newy]&& area[newx][newy] != '#'){vis[newx][newy] = 1;string temp = st;st += area[newx][newy];dfs(step + 1, newx, newy, st);st = temp;vis[newx][newy] = 0;}}}int main(){memset(vis, 0, sizeof(vis));while (cin >> R >> C){if (R == 0 && C == 0) break;ans = "";for (int i = 0; i < R; i++){for (int j = 0; j < C; j++){cin >> area[i][j];}}for (int i = 0; i < R; i++){for (int j = 0; j < C; j++){if (area[i][j] != '#'){string t = "";t += area[i][j];vis[i][j] = true;dfs(1, i, j, t);vis[i][j] = false;}}}cout << ans << endl;}return 0;}
阅读全文
0 0
- uva Biggest Number UVA
- uva 11882Biggest Number
- UVA 11882Biggest Number
- Biggest Number UVA
- Biggest Number UVA
- Uva 11882 Biggest Number (IDA*)
- UVA 11882(p218)----Biggest Number
- 【搜索+强剪枝】UVA-11882 - Biggest Number
- UVa 11882:Biggest Number(DFS+剪枝)
- Biggest Number
- UVA 11882 Biggest Number (dfs搜索+bfs 剪枝)
- UVA 11882 Biggest Number (搜索+剪枝(dfs+bfs))
- UVA11882 Biggest Number
- 11882 - Biggest Number
- Hoj 13326 Biggest Number
- toj 4610 Biggest Number
- UVA11882 Biggest Number 强剪枝
- NBUT [1464] Biggest Number dfs
- [DevExpress使用随笔]之NavBarControl控件(二)
- windows10+cuda8.0+cudnn5.1+vs2013下编译caffe
- Java中Synchronized修饰不同位置的用法
- webStore
- swift3.0闭包
- Biggest Number UVA
- Mac下设置Android源代码编译环境
- 道法术器势
- [基础常识]迁移ECS云服务器
- Android Studio 入门级教程(一)
- java 多种实现获取时间的方法
- leetCode高频题刷题记录1;
- 抓包工具Charles
- pdb 基本调试命令