【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 107646
  • 排名 - 231

最新评论

阅读排行榜

评论排行榜

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

分析:
    第一次从任意的一个可行点DFS找到一条最长的路径,再以最后找到的那个点再DFS找最长的一段路径即可。


【参考程序】:

#include<cstring>
#include
<cstdio>
#include
<iostream>
using namespace std;

const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};
char map[1010][1010];
bool vis[1010][1010];
int n,m,ans,xn,ym;
bool check(int x,int y)
{
    
if (x>0 && x<=&& y>0 && y<=&& map[x][y]=='.')
        
return true;
    
return false;
}
void dfs(int x,int y,int dep)
{
    
if (dep>ans)
    {
        ans
=dep;
        xn
=x;ym=y;
        
//return ;
    }
    vis[x][y]
=true;
    
int tx,ty;
    
for (int i=0;i<=3;i++)
    {
        tx
=x+dx[i]; ty=y+dy[i];
        
if (!vis[tx][ty] && check(tx,ty)) dfs(tx,ty,dep+1);
    }
    vis[x][y]
=false;
}
void get()
{
    memset(vis,
false,sizeof(vis));
    
for (int i=1;i<=n;i++)
        
for (int j=1;j<=m;j++)
            
if (map[i][j]=='.')
            {
                xn
=i; ym=j;
                vis[i][i]
=true;
                dfs(i,j,
0);
                
return ;
            }
}
void solve()
{
    ans
=0;
    
get();
    memset(vis,
false,sizeof(vis));
    vis[xn][ym]
=true;
    ans
=0;
    dfs(xn,ym,
0);
    printf(
"%d\n",ans);
}
int main()
{
    scanf(
"%d%d",&m,&n); getchar();
    
for (int i=1;i<=n;i++)
    {
        
for (int j=1;j<=m;j++) scanf("%c",&map[i][j]);
        getchar();
    }
    solve();
    
return 0;
}
posted on 2009-08-21 21:16 开拓者 阅读(333) 评论(0)  编辑 收藏 引用 所属分类: 图论算法&例题Vijos OJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理