2022春每日一题:Day 7


题目:Fire

先预处理出每个F蔓延的时间,再bfs走迷宫。

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int N=1005;
using namespace std;
struct pos
{
	int x,y,s;
	pos(int xx,int yy,int ss)
	{
		x=xx;y=yy;s=ss;
	}
	pos(){
	}
}p;
char a[N][N];
int n,m,sx,sy,vis[N][N],b[N][N];
int nxt[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
queue < pos > q,q1;
void bfs()
{
	while(!q1.empty())
	{
		pos p=q1.front();
		q1.pop();
		int x=p.x,y=p.y;
		for(int i=0;i<4;i++)
		{
			int xx=x+nxt[i][0],yy=y+nxt[i][1];
			if(xx<1 || xx>n || yy<1 || yy>m)
			    continue;
			if(a[xx][yy]=='#')
			    continue;
			if(vis[xx][yy]==-1 || p.s+1<vis[xx][yy])
			    vis[xx][yy]=p.s+1,q1.push(pos(xx,yy,p.s+1));
		}
	}
}
void solve()
{
	memset(vis,-1,sizeof(vis));
	memset(b,0,sizeof(b));
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	    scanf("%s",a[i]+1);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++)
	        if(a[i][j]=='J')
	            sx=i,sy=j;
	        else if(a[i][j]=='F')
	            vis[i][j]=0,q1.push(pos(i,j,0));
	bfs();
	while(!q.empty())
	    q.pop();
	q.push(pos(sx,sy,0));
	while(!q.empty())
	{
		pos p=q.front();
		q.pop();
		int x=p.x,y=p.y;
		if(x==1 || y==1 || x==n || y==m)
		{
			printf("%d\n",p.s+1);
			return ;
		}
		if(b[x][y])
		    continue;
		b[x][y]=1;
		for(int i=0;i<4;i++)
		{
			int xx=x+nxt[i][0],yy=y+nxt[i][1];
			if(xx<1 || xx>n || yy<1 || yy>m)
			    continue;
			if(a[xx][yy]=='#' || (vis[xx][yy]!=-1 && vis[xx][yy]<=p.s+1))
			    continue;
			q.push(pos(xx,yy,p.s+1));
		}
	}
	puts("IMPOSSIBLE");
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	    solve();
	return 0;
}
posted @   __honey  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示