poj 1383 Labyrinth【迷宫bfs+树的直径】
| Time Limit: 2000MS | Memory Limit: 32768K | |
| Total Submissions: 4004 | Accepted: 1504 |
Description
Input
The labyrinth is designed in such a way that there is exactly one path between any two free blocks. Consequently, if we find the proper hooks to connect, it is easy to find the right path connecting them.
Output
Sample Input
2
3 3
###
#.#
###
7 6
#######
#.#.###
#.#.###
#.#.#.#
#.....#
#######
Sample Output
Maximum rope length is 0.
Maximum rope length is 8. 题意:一段绳子,可以在迷宫内使用,要求这段绳子可以从迷宫内任意一点到任意的另一点,求绳子的最小长度
题解:求迷宫内最长路径的长度,利用树的直径的求法,进行两次bfs
利用队列记距离:
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 1010
using namespace std;
char map[MAX][MAX];
bool vis[MAX][MAX];
int n,m;
int ans,sum,x1,y1,x2,y2;
struct node
{
int x,y;
int ong;
};
void getmap()
{
int i,j;
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='.')
{
x1=i;
y1=j;
return ;
}
}
}
bool judge(int c,int r)
{
if(c>=0&&c<n&&r>=0&&r<m&&map[c][r]!='#'&&!vis[c][r])
return true;
return false;
}
void bfs(int x1,int y1)
{
int i,j;
int move[4][2]={0,1,0,-1,1,0,-1,0};
memset(vis,false,sizeof(vis));
node beg,end;
queue<node>q;
beg.x=x1;
beg.y=y1;
beg.ong=0;
vis[x1][y1]=true;
q.push(beg);
while(!q.empty())
{
end=q.front();
q.pop();
for(i=0;i<4;i++)
{
beg.x=end.x+move[i][0];
beg.y=end.y+move[i][1];
if(judge(beg.x,beg.y))
{
vis[beg.x][beg.y]=true;
beg.ong=end.ong+1;
if(ans<beg.ong)
{
ans=beg.ong;
x2=beg.x;
y2=beg.y;
}
q.push(beg);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
getchar();
scanf("%d%d",&m,&n);
ans=0;
getmap();
bfs(x1,y1);
bfs(x2,y2);
printf("Maximum rope length is %d.\n",ans);
}
return 0;
}
利用dis[]数组记录距离:
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 1010
using namespace std;
char map[MAX][MAX];
bool vis[MAX][MAX];
int dis[MAX][MAX];
int n,m;
int ans,sum,x1,y1,x2,y2;
struct node
{
int x,y;
};
void getmap()
{
int i,j;
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='.')
{
x1=i;
y1=j;
return ;
}
}
}
bool judge(int c,int r)
{
if(c>=0&&c<n&&r>=0&&r<m&&map[c][r]!='#'&&!vis[c][r])
return true;
return false;
}
void bfs(int x1,int y1)
{
int i,j;
int move[4][2]={0,1,0,-1,1,0,-1,0};
memset(vis,false,sizeof(vis));
memset(dis,0,sizeof(dis));
node beg,end;
queue<node>q;
beg.x=x1;
beg.y=y1;
vis[x1][y1]=true;
q.push(beg);
while(!q.empty())
{
end=q.front();
q.pop();
for(i=0;i<4;i++)
{
beg.x=end.x+move[i][0];
beg.y=end.y+move[i][1];
if(judge(beg.x,beg.y))
{
vis[beg.x][beg.y]=true;
dis[beg.x][beg.y]=dis[end.x][end.y]+1;
if(ans<dis[beg.x][beg.y])
{
ans=dis[beg.x][beg.y];
x2=beg.x;
y2=beg.y;
}
q.push(beg);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
getchar();
scanf("%d%d",&m,&n);
ans=0;
getmap();
bfs(x1,y1);
bfs(x2,y2);
printf("Maximum rope length is %d.\n",ans);
}
return 0;
}
poj 1383 Labyrinth【迷宫bfs+树的直径】的更多相关文章
- POJ 1383 Labyrinth (bfs 树的直径)
Labyrinth 题目链接: http://acm.hust.edu.cn/vjudge/contest/130510#problem/E Description The northern part ...
- poj 1383 Labyrinth
题目连接 http://poj.org/problem?id=1383 Labyrinth Description The northern part of the Pyramid contains ...
- POJ 1985 Cow Marathon(树的直径模板)
http://poj.org/problem?id=1985 题意:给出树,求最远距离. 题意: 树的直径. 树的直径是指树的最长简单路. 求法: 两遍BFS :先任选一个起点BFS找到最长路的终点, ...
- URAL 1145—— Rope in the Labyrinth——————【求树的直径】
Rope in the Labyrinth Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64 ...
- poj 1985 Cow Marathon【树的直径裸题】
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 4185 Accepted: 2118 Case ...
- codeforce 337D Book of Evil ----树形DP&bfs&树的直径
比较经典的老题 题目意思:给你一颗节点数为n的树,然后其中m个特殊点,再给你一个值d,问你在树中有多少个点到这m个点的距离都不大于d. 这题的写法有点像树的直径求法,先随便选择一个点(姑且设为点1)来 ...
- codeforces 690C2 C2. Brain Network (medium)(bfs+树的直径)
题目链接: C2. Brain Network (medium) time limit per test 2 seconds memory limit per test 256 megabytes i ...
- POJ 1985 Cow Marathon【树的直径】
题目大意:给你一棵树,要你求树的直径的长度 思路:随便找个点bfs出最长的点,那个点一定是一条直径的起点,再从那个点BFS出最长点即可 以下研究了半天才敢交,1.这题的输入格式遵照poj1984,其实 ...
- POJ 1383 Labyrinth (树的直径求两点间最大距离)
Description The northern part of the Pyramid contains a very large and complicated labyrinth. The la ...
随机推荐
- [Twisted] transport和protocol解耦
Twisted中transport和protocol完全解耦. 这样设计的优点: 1.不同的Protocol协议实现可以重用相同类型的transport. 2.方便测试:假如测试一个协议实现,可以使用 ...
- html-----002
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c、c++混编实现查询本地IP地址
一.思路 1.要想得到本地IP地址,可以通过本机名来查询,所以首先得得到本机名. 2.牵涉到IP地址,首先想到牵涉到网络协议,因此得加载套接字协议,所以先使用WSAStartup函数完成对Winsoc ...
- Chrome退出全屏问题
最近做了一个号称很炫的B/S展示软件,展示所用浏览器为Google Chrome. 要求展示时全屏,但是页面要有退出全屏按钮(液晶屏没有键盘). 搜索实现方式几乎前篇一律,即两个JS函数一个实现全屏一 ...
- (转)Android Service 双进程常驻后台(2)
最近项目用到Service常驻后台,研究了一下发现手Q和微信都是使用了双进程来保证一键清理后自动复活,copy网上双进程Service的例子,再结合onTrimMemory(),基本实现一键清理后自动 ...
- 【随记】SQL Server连接字符串参数说明
废话不多说,请参见 SqlConnection.ConnectionString .
- linux 备份日志文件
seo说要备份文件,然后自己搞不定,每天一份文件.写了个shell,加了个crontab -e任务.每天执行一次. crontab: 59 23 * * * /root/sh/dumpApacheLo ...
- TCP/IP笔记 应用层(1)——DNS
1. DNS DNS(Domain Name System ):域名系统,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机 ...
- 【python】二进制、八进制、十六进制表示方法(3.0以上)
2进制是以0b开头的: 例如: 0b11 则表示十进制的3 8进制是以0o开头的: 例如: 0o11则表示十进制的9 (与2.0版本有区别) 16进制是以0x开头的: 例如: 0x11则表示十进制的1 ...
- #Leet Code# Unique Tree
语言:Python 描述:使用递归实现 class Solution: # @return an integer def numTrees(self, n): : elif n == : else: ...