toj 1056 Labyrinth 搜索,树的直径

题目地址:toj1056

接上一篇 同样 还是求树的直径   

直接两遍dfs

代码:

#include<iostream>
#include<utility>
#include<map>
#include<cstring>

using namespace std;
#define INF 1000000000

typedef  pair<int, int> pii;

map<pii,int>  map;

char  p[1005][1005];
bool  vis[1005][1005];
int   dis[1005][1005];


int a,b;


int n,m;

void init()
{
  
    memset(vis, 0, sizeof(vis));
    
    int startx=a;
    int starty=b;
    
    
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            dis[i][j]=(i==startx&&j==starty?0:INF);
 
    
}


void dfs(int x,int y)
{
    
    vis[x][y]=1;
    
    if(x<n-1)
    {
       if(!vis[x+1][y]&&p[x+1][y]!='#')
       {
           dis[x+1][y]=dis[x][y]+1;
           dfs(x+1,y);
         
       }
    }
    
    if(y<m-1)
    {
        if(!vis[x][y+1]&&p[x][y+1]!='#')
        {
            dis[x][y+1]=dis[x][y]+1;
            dfs(x,y+1);
            
        }
    }
    
    if(x>0)
    {
        if(!vis[x-1][y]&&p[x-1][y]!='#')
        {
            dis[x-1][y]=dis[x][y]+1;
            dfs(x-1,y);
         
        }
    }
    
    if(y>0)
    {
        if(!vis[x][y-1]&&p[x][y-1]!='#')
        {
            dis[x][y-1]=dis[x][y]+1;
            dfs(x,y-1);
            
        }
    }
    
    
    
}
int main()
{
    int cas;
    cin>>cas;
    while(cas--)
    {
        cin>>m>>n;
        

        
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                cin>>p[i][j];
               
            }
        
//        for(int i=0;i<n;i++)
//        {
//            for(int j=0;j<m;j++)
//                cout<<p[i][j];
//            
//            cout<<endl;
//        }
        
        
        bool find=0;
        
        for(int i=0;i<n;i++)
        {
            if(find)  break;
            for(int j=0;j<m;j++)
               if(p[i][j]=='.')
                {
                    a=i;
                    b=j;
                    find=1;
                    break;
                }
        
        }
        
        
        init();
        dfs(a,b);
        int maxi=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
              if(dis[i][j]!=INF&&dis[i][j]>maxi)
              {
                  maxi=dis[i][j];
                  a=i;
                  b=j;
              }
            }
        
       
        init();
        dfs(a,b);
        
        maxi=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if(dis[i][j]!=INF&&dis[i][j]>maxi)
                {
                    maxi=dis[i][j];
                  
                }
            }
        
        cout<<"Maximum rope length is "<<maxi<<"."<<endl;
    }
}


posted on 2014-03-22 22:39  814jingqi的ACM  阅读(137)  评论(0编辑  收藏  举报