貌似好久没有写题解了,水一发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就是可以经过的点的个数
}