HDU2612 Find a way
2015-08-09 00:06
585 查看
给出一个矩阵,里面有墙(#),有起点M和Y,有KFC(@),求M和Y到某一个@的最短时间(也就是求两个路径的和的最小值)
用两个BFS分别可以求出M和Y到每一个@的最短时间(最短路),然后在所有的@中,找到(M到@+Y到@)的最小值。
#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const int N = 220,dir[4][2]={1,0,-1,0,0,1,0,-1},MAX=2000000000;
int yvis
, mvis
, n, m,res;
char maze
;
struct Node
{
int y, x;
Node(int yy=0,int xx=0):y(yy),x(xx){}
} t;
void ybfs()
{
memset ( yvis, 0, sizeof ( yvis ) );
queue<Node> q;
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < m; j++ )
if ( maze[i][j] == 'Y' )
{
q.push ( Node ( i, j ) );
i = n;
j = m;
}
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int ny=t.y+dir[i][0];
int nx=t.x+dir[i][1];
if(ny>=0&&ny<n&&nx>=0&&nx<m&&yvis[ny][nx]==0&&maze[ny][nx]!='#')
{
yvis[ny][nx]=yvis[t.y][t.x]+1;
q.push(Node(ny,nx));
}
}
}
}
void mbfs()
{
res=MAX;
memset ( mvis, 0, sizeof ( mvis ) );
queue<Node> q;
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < m; j++ )
if ( maze[i][j] == 'M' )
{
q.push ( Node ( i, j ) );
i = n;
j = m;
}
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int ny=t.y+dir[i][0];
int nx=t.x+dir[i][1];
if(ny>=0&&ny<n&&nx>=0&&nx<m&&mvis[ny][nx]==0&&maze[ny][nx]!='#')
{
mvis[ny][nx]=mvis[t.y][t.x]+1;
q.push(Node(ny,nx));
if(maze[ny][nx]=='@')
if(yvis[ny][nx]+mvis[ny][nx]<res)
res=yvis[ny][nx]+mvis[ny][nx];
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while ( scanf ( "%d%d", &n, &m ) !=EOF)
{
getchar();
for ( int i = 0; i < n; i++ )
scanf ( "%s", maze[i] );
ybfs();
mbfs();
printf("%d\n",res*11);
}
return 0;
}
用两个BFS分别可以求出M和Y到每一个@的最短时间(最短路),然后在所有的@中,找到(M到@+Y到@)的最小值。
#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const int N = 220,dir[4][2]={1,0,-1,0,0,1,0,-1},MAX=2000000000;
int yvis
, mvis
, n, m,res;
char maze
;
struct Node
{
int y, x;
Node(int yy=0,int xx=0):y(yy),x(xx){}
} t;
void ybfs()
{
memset ( yvis, 0, sizeof ( yvis ) );
queue<Node> q;
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < m; j++ )
if ( maze[i][j] == 'Y' )
{
q.push ( Node ( i, j ) );
i = n;
j = m;
}
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int ny=t.y+dir[i][0];
int nx=t.x+dir[i][1];
if(ny>=0&&ny<n&&nx>=0&&nx<m&&yvis[ny][nx]==0&&maze[ny][nx]!='#')
{
yvis[ny][nx]=yvis[t.y][t.x]+1;
q.push(Node(ny,nx));
}
}
}
}
void mbfs()
{
res=MAX;
memset ( mvis, 0, sizeof ( mvis ) );
queue<Node> q;
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < m; j++ )
if ( maze[i][j] == 'M' )
{
q.push ( Node ( i, j ) );
i = n;
j = m;
}
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int ny=t.y+dir[i][0];
int nx=t.x+dir[i][1];
if(ny>=0&&ny<n&&nx>=0&&nx<m&&mvis[ny][nx]==0&&maze[ny][nx]!='#')
{
mvis[ny][nx]=mvis[t.y][t.x]+1;
q.push(Node(ny,nx));
if(maze[ny][nx]=='@')
if(yvis[ny][nx]+mvis[ny][nx]<res)
res=yvis[ny][nx]+mvis[ny][nx];
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while ( scanf ( "%d%d", &n, &m ) !=EOF)
{
getchar();
for ( int i = 0; i < n; i++ )
scanf ( "%s", maze[i] );
ybfs();
mbfs();
printf("%d\n",res*11);
}
return 0;
}
相关文章推荐
- Surrounded Regions
- Word Ladder, Gray Code
- UVA 11624
- HDU1495
- Hdu2444二分图
- 最少步数BFS
- 转v_JULY_v的 BFS和DFS优先搜索算法
- 2015 寒假搜索专题 I - Meteor Shower(BFS)
- Same Tree
- E - Roads in the North
- DFS&BFS算法总结(1)
- Word Ladder I
- 图的BFS和DFS学习笔记
- [LeetCode] Binary Tree Level Order Traversal
- [LeetCode] Binary Tree Level Order Traversal II
- 关于BFS搜索的思想, 最简单的水题,不过深有体会啊。
- Word Ladder II
- Surrounded Regions
- vijosP1016北京2008的挂钟 BFS + 优先队列
- FZU 2169 shadow