43pts 大爆搜 求条
查看原帖
43pts 大爆搜 求条
1039274
Cypher_404楼主2024/9/7 08:48
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
	int x,y;
};
int dx[]={1,2,4,8,16,32,64,128,256,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-2,-4,-8,-16,-32,-64,-128,-256,-512};
int dy[]={0,0,0,0,0,0,0,0,0,0,1,2,4,8,16,32,64,128,256,512,-1,-2,-4,-8,-16,-32,-64,-128,-256,-512,0,0,0,0,0,0,0,0,0,0};//预处理数组
queue<node>que;
int dis[1010][1010];
char a[1145][1419];
int h[1010][1010];
int z[1010][1010];
void bfs()//广搜
{
	que.push({1,1});
	while(!que.empty())
	{
		node u=que.front();
		que.pop();
		for(int i=0;i<40;i++)
		{
			int nx=u.x+dx[i],
			    ny=u.y+dy[i];
			if(nx<1||nx>n||ny<1||ny>m)
			{
				continue;
			}
			if(a[nx][ny]=='X'||a[nx][ny]=='.')
			{
				continue;
			}
			int x=u.x,y=u.y;
			if(nx!=x)//判断路径上是否有障碍
			{
				if(h[nx][ny]-h[x][y]!=0)
					continue;
			}
			else
			{
				if(z[ny][nx]-z[y][nx]!=0)
					continue;
			}
			if(dis[nx][ny]>dis[u.x][u.y]+1)
			{
				dis[nx][ny]=dis[u.x][u.y]+1;
				que.push({nx,ny});
			}
		}
	}
}
int main()
{
	for(int i=1;i<=1000;i++)
	{
		for(int j=1;j<=1000;j++)
		{
			dis[i][j]=1000000000;
		}
	}//初始化
	cin>>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++)
		{
			h[i][j]+=h[i][j-1];
			h[i][j]+=((a[i][j]=='X'||a[i][j]=='.')?1:0);
		}
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			z[j][i]+=z[j-1][i];
			z[j][i]+=((a[j][i]=='X'||a[j][i]=='.')?1:0);
		}
	}//预处理障碍数组
	dis[1][1]=0;
	bfs();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i][j]=='#')
			{
				cout<<dis[i][j];//输出答案
				exit(0);
			}
		}
	}
	return 0;
}

求助 dalao

2024/9/7 08:48
加载中...