Find a way - HDU 2612 - Virtual Judge (vjudge.net)
题目大意:N*M地图,#表示障碍物,@表示终点(可能有多个),请问Y,M到@最近的是多少
比如Y到@是3,M到@是4,答案就是(3+4)*11 题目的意思
思路:用两个BFS,Y到每个@的距离记录一下
轮到M时,每到达一个@就计算一下距离
我用的一个bfs,用name区分了一下
多组输入记得每次while(t--)的时候清空一下数组
#include<iostream>
#include<queue>
#include<set>
#include<string>
using namespace std;
#define int long long
int map[500][500];
int vis[500][500];
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
int n, m;
int startx, starty;
int endx, endy;
int ans = 0;
int flag = 0;
void dfs(int x, int y)
{
if (x == endx && y == endy)
{
flag = 1;
return;
}
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx <= 0 || ny <= 0 || nx > n || ny > m || vis[nx][ny] || map[nx][ny] == 1)continue;
else
{
vis[nx][ny] = 1;
dfs(nx, ny);
vis[nx][ny] = 0;
}
}
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
char s;
cin >> s;
if (s == 'S')
{
startx = i;
starty = j;
map[i][j] = 0;
}
else if (s == '.')
{
map[i][j] = 0;
}
else if (s == '*')
{
map[i][j] = 1;
}
else
{
endx = i;
endy = j;
}
}
}
vis[startx][starty] = 1;
dfs(startx, starty);
if (flag)cout << "yes" << endl;
else cout << "no" << endl;
return 0;
}