找朋友(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

*/

  

 

 

 

 

 

 

posted @ 2024-08-20 07:07  cn是大帅哥886  阅读(53)  评论(0)    收藏  举报