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) 编辑 收藏 举报