ACM 搜索 hdu 2612 Find a way
2016-05-28 10:20
323 查看
[align=left]Problem Description[/align]
Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.
Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.
Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.
[align=left]Input[/align]
The input contains multiple test cases.
Each test case include, first two integers n, m. (2<=n,m<=200).
Next n lines, each line included m character.
‘Y’ express yifenfei initial position.
‘M’ express Merceki initial position.
‘#’ forbid road;
‘.’ Road.
‘@’ KCF
[align=left]Output[/align]
For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.
[align=left]Sample Input[/align]
4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#
[align=left]Sample Output[/align]
66
88
66
他不只有一个KFC!这意味着我们需要求出所有的来,找最小值。那样我们可以设立一个数组,记录人到x,y点处所用的时间,之后这要这个点是KFC,我们就更新min!!!!
除此之外就是一个很经典的BFS了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct node
{
int x;
int y;
int count;
};
int n,m;
char ditu[1005][1005];
bool visit[1005][1005];
int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int manx,many,womanx,womany;
int mantime[1005][1005],womentime[1005][1005];
deque<node>Q;
void BFS(node p,int mantime[][1005])
{
int i;
node q;
memset(visit,0,sizeof(visit));
memset(mantime,0,sizeof(mantime));
Q.push_front(p);
while(!Q.empty())
{
p=Q.front();
Q.pop_front();
for(i=0;i<4;i++)
{
q.x=p.x+to[i][0];
q.y=p.y+to[i][1];
q.count=p.count+1;
if (q.x>=0&&q.y>=0&&q.x<m&&q.y<n&&ditu[q.x][q.y]!='#'&&!visit[q.x][q.y])
{
visit[q.x][q.y]=1;
mantime[q.x][q.y]=q.count;
Q.push_back(q);
}
}
}
}
int main()
{
int i,j,min;
node p;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
cin>>ditu[i][j];
if(ditu[i][j]=='Y')
{
manx=i;
many=j;
}
else if(ditu[i][j]=='M')
{
womanx=i;
womany=j;
}
}
}
min=9999999;
p.x=manx;
p.y=many;
p.count=0;
BFS(p,mantime);
p.x=womanx;
p.y=womany;
p.count=0;
BFS(p,womentime);
for (i=0;i<m;i++)
for (j=0;j<n;j++)
if (ditu[i][j]=='@')
if (mantime[i][j]!=0&&womentime[i][j]!=0)
if(mantime[i][j]+womentime[i][j]<min)/*比较求距离的最小值*/
min = mantime[i][j]+womentime[i][j];
printf("%d/n",min*11);
}
Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.
Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.
Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.
[align=left]Input[/align]
The input contains multiple test cases.
Each test case include, first two integers n, m. (2<=n,m<=200).
Next n lines, each line included m character.
‘Y’ express yifenfei initial position.
‘M’ express Merceki initial position.
‘#’ forbid road;
‘.’ Road.
‘@’ KCF
[align=left]Output[/align]
For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.
[align=left]Sample Input[/align]
4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#
[align=left]Sample Output[/align]
66
88
66
他不只有一个KFC!这意味着我们需要求出所有的来,找最小值。那样我们可以设立一个数组,记录人到x,y点处所用的时间,之后这要这个点是KFC,我们就更新min!!!!
除此之外就是一个很经典的BFS了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct node
{
int x;
int y;
int count;
};
int n,m;
char ditu[1005][1005];
bool visit[1005][1005];
int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int manx,many,womanx,womany;
int mantime[1005][1005],womentime[1005][1005];
deque<node>Q;
void BFS(node p,int mantime[][1005])
{
int i;
node q;
memset(visit,0,sizeof(visit));
memset(mantime,0,sizeof(mantime));
Q.push_front(p);
while(!Q.empty())
{
p=Q.front();
Q.pop_front();
for(i=0;i<4;i++)
{
q.x=p.x+to[i][0];
q.y=p.y+to[i][1];
q.count=p.count+1;
if (q.x>=0&&q.y>=0&&q.x<m&&q.y<n&&ditu[q.x][q.y]!='#'&&!visit[q.x][q.y])
{
visit[q.x][q.y]=1;
mantime[q.x][q.y]=q.count;
Q.push_back(q);
}
}
}
}
int main()
{
int i,j,min;
node p;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
cin>>ditu[i][j];
if(ditu[i][j]=='Y')
{
manx=i;
many=j;
}
else if(ditu[i][j]=='M')
{
womanx=i;
womany=j;
}
}
}
min=9999999;
p.x=manx;
p.y=many;
p.count=0;
BFS(p,mantime);
p.x=womanx;
p.y=womany;
p.count=0;
BFS(p,womentime);
for (i=0;i<m;i++)
for (j=0;j<n;j++)
if (ditu[i][j]=='@')
if (mantime[i][j]!=0&&womentime[i][j]!=0)
if(mantime[i][j]+womentime[i][j]<min)/*比较求距离的最小值*/
min = mantime[i][j]+womentime[i][j];
printf("%d/n",min*11);
}
相关文章推荐
- 包名下存储
- @Resource和@Autowired
- C#根据文件流判断文件类型
- 一站式学习Wireshark(四):网络性能排查之TCP重传与重复ACK
- NYOJ 矩形嵌套--16
- ThinkPHP+phpstudy2014报 no input错误
- 一站式学习Wireshark(三):应用Wireshark IO图形工具分析数据流
- windows和linux下Tomcat内存的分配与溢出的配置详解
- SD卡文件存储
- 关于解决Xcode更新7.3之后插件不能用的问题
- 为什么Actor模型是高并发事务的终极解决方案?
- 算法学习与代码实现4——冒泡排序
- SQL简介
- 异步传输与同步传输区别
- 撤销修改
- 系统联系人
- 在 Mac系统中,怎么能够连续的看图片
- 使用ListView应该注意的地方
- Maven+SpringMVC+Freemarker入门Demo
- SHOPNC2.4在PHP5.4下的调整