您的位置:首页 > 其它

Biggest Number UVA - 11882

2017-11-23 14:36 169 查看
比较简单的一道搜索的题目,从有数字的位置开始,分别向上下左右四个方向进行搜索,搜索的同时记录已经访问的数字串,并且记录当前已经使用的数字串的个数,计算出还可能使用的数字串的个数,如果两者之和小于已经保存的最优的结果的长度,那么就直接返回,如果长度相等,那么就对字符串进行比较,如果小于,那么也就直接返回。具体实现见如下代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: