首页 > 代码库 > 环游大同80天 cruisedt

环游大同80天 cruisedt

【题目描述】:

一年一度的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