描述Description
一年一度的xuzhenyiOI2006在风景如画的大同中学举行。按照以往惯例,在激烈的比赛过程后,选手们会应邀去风景名胜区游览。今年当然也不例外。为了确定一条最佳的旅游路线,组委会请各位选手编一程序帮忙寻找。假设所有的风景点都集中在一个C列R行的矩阵中,矩阵的每一元素代表风景点或者障碍物。现在你要寻找一条满足下列条件的最佳旅游路线:
●这条路线上的每一点结点必须是风景点(即不能为障碍物)
●每个风景点最多游览一次
●这条路线必须是连续的相邻风景点的序列(若风景点A和B分别位于矩阵的位置(a1,a2)及(b1,b2),且|a1-b1|+|a2-b2|=1,则风景点A和B是相邻的)
●在满足上述条件下,游览的风景点尽可能多
假设任意的两个风景点都有且仅有一条路径(无回路)相连。显然,任意一个风景点都可以作为游览路线的起点或者终点。
输入格式Input Format
第一行是两个整数C和R(3≤C,R≤1000),表示矩阵的列数和行数。
接下来有R行,每行有C个字符,每个字符都只能是‘#’或‘.’,‘#’表示障碍物,‘.’表示风景点。行手行末无多余空格。
输出格式Output Format
只有一行,输出最佳路线的长度。
样例输入Sample Input
3 3
###
#.#
###
样例输出Sample Output
0
数据规模
对于所有的数据:3≤C,R≤1000
分析:这个是一个搜索题,深搜…………不过需要两遍……囧……看大牛的题解…………
附:大牛的题解-----来源RONG大牛的空间 http://hi.baidu.com/wyhbb163/blog/item/4d74c883a57520b76c811986.html
对于这一题,由于所有点都联通,所以任意找一个非障碍的点A,以此为根进行深搜,找到一个离他最远的点B,记录下来,再以此点为根进行深搜,又可以找到一个距离最远的点C,则B-C即为所求。
代码:
代码
1 program around;
2 const dxy:array[1..4,1..2]of integer=((1,0),(-1,0),(0,1),(0,-1));
3 var f:array[1..1000,1..1000]of boolean;
4 a:array[1..1000,1..1000]of char;
5 n,m,max,mx,my,x,y:longint;
6
7 procedure init;
8 var i,j:longint;
9 begin
10 assign(input,'around.in');
11 reset(input);
12 assign(output,'around.out');
13 rewrite(output);
14 readln(n,m);
15 for i:=1 to n do
16 begin
17 for j:=1 to m do
18 read(a[i,j]);
19 readln;
20 end;
21 close(input);
22 end;
23
24 procedure dfs(d,i,j:longint);
25 var k:longint;
26 begin
27 f[i,j]:=true;
28 if d>=max then
29 begin
30 max:=d;
31 mx:=i;
32 my:=j;
33 end;
34 for k:=1 to 4 do
35 begin
36 x:=i+dxy[k,1];
37 y:=j+dxy[k,2];
38 if (not f[x,y])and(x>=1)and(y>=1)and(x<=n)and(y<=m)and(a[x,y]='.') then
39 dfs(d+1,x,y);
40 end;
41 end;
42
43 procedure main;
44 var i,j:longint;
45 begin
46 for i:=1 to n do
47 for j:=1 to m do
48 if (not f[i,j])and(a[i,j]<>'#') then
49 begin
50 dfs(0,i,j);
51 fillchar(f,sizeof(f),false);
52 dfs(0,mx,my);
53 writeln(max);
54 close(output);
55 halt;
56 end;
57 close(output);
58 end;
59
60 begin
61 init;
62 main;
63 end.

浙公网安备 33010602011771号