找朋友(bfs常错!!)
第1题 找朋友 查看测评数据信息
有一个H行和W列的网格。(i,j)表示位于从上往下第i行和从左往右第j列的单元格。每个单元格有字符A(i,j):
(1)A(i,j)=’.’表示空单元格
(2)A(i,j)=’#’表示一个障碍物
(3)A(i,j)=’S’表示起点
(4)A(i,j)=’T’表示终点
现在Jane可以通过消耗1能量从当前单元格移动到上下左右的空单元格。如果能量为0,他就无法移动,也无法离开网格。网格中有N种药。第i种药位于空格(R,C)处,可以用来把能量变成E[i]。注意,能量并不一定会增加。他可以在当前格子中使用药物。使用过的药物会消失。Jane以0的能量从起点开始,并希望达到终点。请判断这是否可行。如果可以输出“Yes”,否则输出“No”。
输入格式
第一行两个整数H,W
接下来H行,每行W个字符,字符可能是’.’,’#’,’S’,’T’
接下来一行一个整数N
接下来N行,每行三个整数R,C,E,表示第R行第C列有一个能把能量变为E的药。
1<=H,W<=200,1<=N<=300,1<=R<=H,1<=C<=W,1<=E<=H*W
输出格式
“Yes”或“No”
输入/输出例子1
输入:
4 4
S...
#..#
#...
..#T
4
1 1 3
1 3 5
3 2 1
2 3 1
输出:
Yes
输入/输出例子2
输入:
2 2
S.
T.
1
1 2 4
输出:
No
样例解释
无
不是?明明会做,每次都写错了
只强调一点
记录最优答案,如果当前搜索的答案不优于最优答案,就跳过,而不是用vis!以后别用那啥vis判断>=1000这种劣质操作了!!!!!!
#include <bits/stdc++.h>
using namespace std;
const int N=205;
struct node
{
int x, y, u;
}s, t;
int n, m, f[N][N], g, x, y, a[N][N], dis[N][N];
int dx[]={0, 0, 1, -1}, dy[]={1, -1, 0, 0};
char c[N][N];
queue<node> q;
bool bfs()
{
memset(dis, 0, sizeof dis);
q.push({s.x, s.y, a[s.x][s.y]});
while (!q.empty())
{
int x=q.front().x, y=q.front().y, u=q.front().u;
q.pop();
if (x==t.x && y==t.y && max(u, dis[x][y])>=0) return 1;
if (u<=0) continue;
if (dis[x][y]>=u) continue;
dis[x][y]=u;
for (int i=0; i<4; i++)
{
int nx=x+dx[i], ny=y+dy[i];
if (nx>=1 && nx<=n && ny>=1 && ny<=m && c[nx][ny]!='#')
{
if (a[nx][ny]>u-1) q.push({nx, ny, a[nx][ny]}), a[nx][ny]=0;
else q.push({nx, ny, u-1});
}
}
}
return 0;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i=1; i<=n; i++) scanf("%s", c[i]+1);
scanf("%d", &g);
while (g--)
{
scanf("%d%d", &x, &y);
scanf("%d", &a[x][y]);
}
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
{
if (c[i][j]=='S') s.x=i, s.y=j;
if (c[i][j]=='T') t.x=i, t.y=j;
}
if (bfs()) printf("Yes");
else printf("No");
return 0;
}
/*
S.5.
#.1#
#1..
..#T
*/

浙公网安备 33010602011771号