Biggest Number UVA - 11882

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

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值