算法设计与分析 5.4 蒂花之秀

★题目描述

地图为一个N行M列的阵图,阵图里的各个结点可能是一个无法通过的障碍格,也可能是一个数字格。

可以从阵图上的任意一个数字格出发,每次沿上下左右之一的方向走一格,但不能走到障碍格中,也不能重复经过一格数字格。

将跑步起点的数字格到终点的数字格,途经的所有格上的数字按照访问顺序连接在一起得到一个整数,作为自己训练的评价指标。

现在给你韩跳跳的训练地图,请问他在这张地图上能得到的最大评价指标是多少?

★输入格式

首先输入一个数T(T<=10),代表总共有T组数据。

每组数据第1行包含两个整数N、M,表示地图为N*M的阵列;

接下来N行每行包括M个字符,由数字“1~9”和“#”组成。

输入保证,每个地图上至少有一个数字格。

★输出格式

每组数据一个整数代表对应地图中能得到的最大评价指标。

★样例输入

1
6 3
122
789
685
7#5
941
48#

★样例输出

9885514849767122

★提示

50%的数据:2<=N,M<=10,N*M<=10;

100%的数据:2<=N,M<=15,N*M<=30

★参考代码

/*
数据量似乎不是很大,尝试深搜遍历整个地图 
*/ 

#include<bits/stdc++.h>
using namespace std;

int T,N,M;
char Map[16][16]; 
int  Vis[16][16];
int  Dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
string res,path;

void df(int x, int y){
	int end=1;
	for(int i=0; i<4; ++i){
		int nx=x+Dir[i][0], ny=y+Dir[i][1];
		if(1<=nx && nx<=N && 1<=ny && ny<=M && Vis[nx][ny]==0 && Map[nx][ny]!='#'){
			Vis[nx][ny]=1, path.push_back(Map[nx][ny]), end=0;
			df(nx, ny);
			Vis[nx][ny]=0, path.pop_back();
		}
	}
	if(end){
		if(path.length()>res.length()) res = path;
		else if(path.length()==res.length()) res = max(res, path);
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);	
	cin>>T;
	while(T--){
		cin>>N>>M;
		
		memset(Vis, 0, sizeof(Vis));
		memset(Map, 0, sizeof(Map));
		res="",path=""; 
		for(int i=1; i<=N; ++i) for(int j=1; j<=M; ++j) cin>>Map[i][j];
		
		for(int i=1; i<=N; ++i) for(int j=1; j<=M; ++j){
			if(Map[i][j]=='#') continue;
			Vis[i][j]=1, path.push_back(Map[i][j]);
			df(i, j);
			Vis[i][j]=0, path.pop_back();
		}
		
		cout<<res<<endl;
	}
	return 0;
} 

posted on 2019-12-22 20:12  yejifeng  阅读(329)  评论(0编辑  收藏  举报

导航