码迷,mamicode.com
首页 > 其他好文 > 详细

环游大同80天 cruisedt

时间:2016-08-27 23:20:03      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

【题目描述】:

一年一度的IOI在风景如画的大同中学举行。按照以往惯例,在激烈的比赛过程后,选手们会应邀去风景名胜区游览。今年当然也不例外。为了确定一条最佳的旅游路线,组委会请各位选手编一程序帮忙寻找。假设所有的风景点都集中在一个CR行的矩阵中,矩阵的每一元素代表风景点或者障碍物。现在你要寻找一条满足下列条件的最佳旅游路线:

●这条路线上的每一点结点必须是风景点(即不能为障碍物)

●每个风景点最多游览一次

●这条路线必须是连续的相邻风景点的序列(若风景点AB分别位于矩阵的位置(a1a2)及(b1b2),且|a1-b1|+|a2-b2|=1,则风景点AB是相邻的)

●在满足上述条件下,游览的风景点尽可能多

假设任意的两个风景点都有且仅有一条路径相连。显然,任意一个风景点都可以作为游览路线的起点或者终点。

 

【输入描述】:

第一行是两个整数CR3CR1000),表示矩阵的列数和行数。

接下来有R行,每行有C个字符,每个字符都只能是‘#’或‘.’,‘#’表示障碍物,‘.’表示风景点。行手行末无多余空格。

 

【输出描述】:

只有一行,输出最佳路线的长度。

 

【样例输入】

【样例输出】

3 3

###

#.#

###

0

【数据范围及描述】:

 

 题解说是 树上最长链(并不懂是什么东西)

两遍正反dfs就好了:

任取一个点,求它所能到达的最远点,在从最远点dfs再找最远点,就是答案!!!

 

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxn=1005;
 8 const int dx[]={1,-1,0,0};
 9 const int dy[]={0,0,1,-1};
10 char g[maxn][maxn];
11 int R,C;
12 bool vis[maxn][maxn];
13 bool been[maxn][maxn];
14 int X,Y,mx;
15 
16 void dfs(int x,int y,int c)
17 {
18     been[x][y]=true;
19     bool flag=false;
20     for(int i=0;i<4;i++)
21     {
22         int xx=x+dx[i];
23         int yy=y+dy[i];
24         if(xx>=1&&xx<=R&&yy>=1&&yy<=C&&!vis[xx][yy]&&g[xx][yy]==.)
25         {
26             vis[xx][yy]=true;
27             flag=true;
28             dfs(xx,yy,c+1);
29             vis[xx][yy]=false;
30         }
31     }
32     if(!flag&&mx<c) 
33     {
34         mx=c;
35         X=x,Y=y;
36     }
37     return;
38 }
39 
40 int main()
41 {
42     scanf("%d %d",&C,&R);
43     for(int i=1;i<=R;i++)
44         gets(g[i]+1);
45     memset(vis,false,sizeof(vis));
46     memset(been,false,sizeof(been));
47     int ans=-1;
48     for(int i=1;i<=R;i++)
49         for(int j=1;j<=C;j++)
50         {
51             if(!been[i][j]&&g[i][j]==.) 
52             {
53                 mx=-1;vis[i][j]=true;
54                 dfs(i,j,0);vis[i][j]=false;
55                 mx=-1;vis[X][Y]=true;
56                 dfs(X,Y,0);vis[X][Y]=false;
57                 ans=max(ans,mx);
58             }
59         }
60     printf("%d",ans);
61     return 0;
62 }
View Code

技术分享

环游大同80天 cruisedt

标签:

原文地址:http://www.cnblogs.com/cnblogsLSY/p/5813975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!