CF1063B Labyrinth

貌似好久没有写题解了,水一发CF B题
这题…怎么看都是BFS,只要双端队列搞一搞就好了但是我不会…
所以…
要用一个DFS搞一下联通快…然后就好了

#include<bits/stdc++.h>
using namespace std;
int M,N,first_x,first_y,max_left,max_right;
int tail=1,head=0,queue_x[4000005],queue_y[4000005],queue_left[4000005],queue_right[4000005];
bool _map[2005][2005];
void around(int first_x,int first_y,int now_left,int now_right)//DFS搞联通快
{
	int now_x=first_x,now_y=first_y;
	while(_map[now_x-1][now_y])//向上将所有可以到的点放入队列
	{
		now_x--;
		queue_x[++tail]=now_x;
		queue_y[tail]=now_y;
		queue_left[tail]=now_left;//还是原来可以走的左边的个数和右边的个数
		queue_right[tail]=now_right;
		_map[queue_x[tail]][queue_y[tail]]=0;
	}
	now_x=first_x;
	now_y=first_y;
	while(_map[now_x+1][now_y])//向下将所有可以到的点放入队列
	{
		now_x++;
		queue_x[++tail]=now_x;
		queue_y[tail]=now_y;
		queue_left[tail]=now_left;//与上面相同
		queue_right[tail]=now_right;
		_map[queue_x[tail]][queue_y[tail]]=0;
	}
}
void turn_left()//向左转
{
	if(_map[queue_x[head]][queue_y[head]-1]&&queue_left[head]<max_left)
	{
		queue_x[++tail]=queue_x[head];
		queue_y[tail]=queue_y[head]-1;
		queue_left[tail]=queue_left[head]+1;//左转的个数加一
		queue_right[tail]=queue_right[head];
		_map[queue_x[tail]][queue_y[tail]]=0;
		around(queue_x[tail],queue_y[tail],queue_left[tail],queue_right[tail]);
	}
}
void turn_right()//向右转同理
{
	if(_map[queue_x[head]][queue_y[head]+1]&&queue_right[head]<max_right)
	{
		queue_x[++tail]=queue_x[head];
		queue_y[tail]=queue_y[head]+1;
		queue_left[tail]=queue_left[head];
		queue_right[tail]=queue_right[head]+1;
		_map[queue_x[tail]][queue_y[tail]]=0;
		around(queue_x[tail],queue_y[tail],queue_left[tail],queue_right[tail]);
	}
}
int main()
{
	scanf("%d%d",&N,&M);
	scanf("%d%d",&first_x,&first_y);
	scanf("%d%d",&max_left,&max_right);
	char ch;
	int i,j;
	for(i=1;i<=N;i++)
	for(j=1;j<=M;j++)
	{
		cin>>ch;
		if(ch=='*')_map[i][j]=0;
		if(ch=='.')_map[i][j]=1;
	}
	//BFS初始化
	queue_x[1]=first_x;
	queue_y[1]=first_y;
	_map[queue_x[1]][queue_y[1]]=0;
	around(queue_x[1],queue_y[1],0,0);
	while(head++<=tail)//BFS主要部分
	{
		turn_left();
		turn_right();
	}
	printf("%d",tail);//tail就是可以经过的点的个数
}
发布了72 篇原创文章 · 获赞 22 · 访问量 5535

猜你喜欢

转载自blog.csdn.net/sxy__orz/article/details/94558833