首页 > 其他分享 >《牛客》-E魔法之森的蘑菇(经典BFS变种)

《牛客》-E魔法之森的蘑菇(经典BFS变种)

时间:2024-03-20 12:58:32浏览次数:30  
标签:sy sx vis int 之森 BFS 牛客 ey push

思路:由于某些固定方向的情况,我们将到达该点的粒度划分成从那个方向的到达该点,及基础bfs为每个点可以到达一次,变成没个点可以到达四次(四个方向)用一个三维数组进行标记vis[N][N][4],其余细节看下方ACcode

ACcode:

#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define N 1005
#define ll long long

struct node
{
	ll x,y,w,f;
}u;
ll n,m,sx,sy,ex,ey;
int vis[N][N][4];
char a[N][N];

int bfs()
{
	queue<node>q;
	q.push({sx,sy,0,1});
	q.push({sx,sy,0,2});
	q.push({sx,sy,0,3});
	q.push({sx,sy,0,4});
	while(q.size())
	{
		u=q.front();
		q.pop();
		if(u.x<1||u.x>n||u.y<1||u.y>m||vis[u.x][u.y][u.f-1])continue;
		if(a[u.x][u.y]=='#')continue;
		vis[u.x][u.y][u.f-1]=1;
		if(u.x==ex&&u.y==ey)return u.w;
		if(a[u.x][u.y]=='.')
		{
			if(u.f==1)q.push({u.x-1,u.y,u.w+1,u.f});
			if(u.f==2)q.push({u.x,u.y+1,u.w+1,u.f});
			if(u.f==3)q.push({u.x+1,u.y,u.w+1,u.f});
			if(u.f==4)q.push({u.x,u.y-1,u.w+1,u.f});
		}
		if(a[u.x][u.y]=='*')
		{
			if(u.f==1)
			{
				q.push({u.x-1,u.y,u.w+1,1});
				q.push({u.x,u.y+1,u.w+1,2});
				q.push({u.x,u.y-1,u.w+1,4});
			}
			if(u.f==2)
			{
				q.push({u.x-1,u.y,u.w+1,1});
				q.push({u.x,u.y+1,u.w+1,2});
				q.push({u.x+1,u.y,u.w+1,3});
			}
			if(u.f==3)
			{
				q.push({u.x+1,u.y,u.w+1,3});
				q.push({u.x,u.y+1,u.w+1,2});
				q.push({u.x,u.y-1,u.w+1,4});
			}
			if(u.f==4)
			{
				q.push({u.x+1,u.y,u.w+1,3});
				q.push({u.x,u.y-1,u.w+1,4});
				q.push({u.x-1,u.y,u.w+1,1});
			}
		}
	}
	return -1;
}

int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int tt=1;
	cin>>tt;
	while(tt--)
	{
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			for(int k=0;k<4;k++)
			{
				vis[i][j][k]=0;
			}
		}
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			if(a[i][j]=='S')
			{
				sx=i,sy=j;
				a[i][j]='.';
			}
			else if(a[i][j]=='T')
			{
				ex=i,ey=j;
				a[i][j]='.';
			}
		}
		cout<<bfs()<<endl;
	}
	return 0;
}

over~

标签:sy,sx,vis,int,之森,BFS,牛客,ey,push
From: https://blog.csdn.net/m0_74969835/article/details/136872983

相关文章

  • BFS记忆化搜索---标记
    迷宫(洛谷)题目描述给定一个\(N\timesM\)方格的迷宫,迷宫里有\(T\)处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。输入格式第......
  • 刷题日记——干碎那个BFS!(含国科大机试2021)
    例题小引——迷宫问题问题描述:迷宫由n行m列的单元格组成(n,m都小于等于50),每个单元格要么是空地,要么是障碍物。现请你找到一条从起点到终点的最短路径长度。分析——(迷宫问题BFS解法)使用BFS算法,进行广度优先遍历,总体思路是访问一个结点,就把相邻的结点入队,然后下一个访......
  • 牛客网BC-30 时间转化(思路)
    题目如下我们可以简单分析一下第一步,我们需要输入秒数第二步,进行下简单的数学分析(如何转化为时分秒)第三步,输出时分秒---------------------------------------------------------------------------------------------------------------------------------    ......
  • bfs判重的坑
    在\(bfs\)中判重时,应优先在入队时进行判重,而不是在出队时进行判重,因为一个节点\(u\)在入队到出队的过程中,可能需要先出队很多其他节点\(v\),这就会导致其他节点出队且加入新节点的过程中,可能会重复加入多次节点\(u\),进而导致\(queue\)占用的空间过大,最后可能有几个点\(MLE......
  • 牛客网Mysql相应试题 SQL28 计算用户8月每天的练题数量
    SQL28计算用户8月每天的练题数量描述题目:现在运营想要计算出2021年8月每天用户练习题目的数量,请取出相应数据。示例:question_practice_detailiddevice_idquestion_idresultdate12138111wrong2021-05-0323214112wrong2021-05-0933214113wrong2......
  • 小y的序列(ST表&二分)---牛客练习赛96-C
    牛客练习赛96-小y的序列解析ST表预处理区间极值差可以发现,对于一个区间[l,r]......
  • 图论:DFS与BFS
    目录1.DFS(图论)1.1.DFS过程1.2.应用2.BFS(图论)2.1.BFS过程2.2.应用2.3.双端队列BFS实现2.4.优先队列BFS(堆优化Dijkstra算法)1.DFS(图论)DFS全称是,中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。广义上的DFS:DF......
  • 牛客小白月赛61-E-排队
    很好的一道题啊,学到了不少东西!!!!首先是一个结论逆序对总数=  n!/2 *不相等的数字对数(1)不相等的数字对数怎么求    结论    不相等的数字对数=C(n,2)-∑C(2,cnt(i))(i数字的出现次数)(2)n!/2怎么处理,有取模的除运算怎么处理???......
  • [牛客]小红的数组分配
    题目思路去考虑sort排序为相同数字为偶数个,输出格式错误的去思考了数组为pair代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e6+10;inti,j,k,n,m,t,res,a[N]={0};strings;voidslove(){ cin>>n; for(i=0;i<n*2;i++)ci......
  • [牛客]小红的正整数
    题目思路我的思路:排好序后找到几个0,在将最后一个0的右边一位输出,再根据0的个数输出0,再输出其余数字别人思路:排好序后将0右边一个和第一个0交换后,直接输出代码#include<bits/stdc++.h>usingnamespacestd;intmain(){chara[6]={};cin>>a;......