一看就是bfs题,但是单纯的想,就错了
错误代码:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=2010;
char g[N][N];
unsigned int yll[N][N];
unsigned int ylr[N][N];
bool vis[N][N];
int n,m;
int sx,sy;
int l,r;
struct node{
   
	int x;
	int y;
	int lst;
	int rst;
};
int dx[4]={
   0,0,1,-1},dy[4]={
   1,-1,0,0};
void bfs()
{
   
	queue<node>q;
	q.push({
   sx-1,sy-1,0,0});
	vis[sx-1][sy-1]=true;
	yll[sx-1][sy-1]=l;
	ylr[sx-1][sy-1]=r;
	while(q.size())
	{
   
		auto t=q.front();
		q.pop();
		int x=t.x;
		int y=t.y;
		int ll=t.lst;
		int rr=t.rst;
		//cout<<x<<' '<<y<<' '<<ll<<' '<<rr<<endl;
		for(int i=0;i<4;i++)
		{
   
			int tx=x+dx[i];
			int ty=y+dy[i];
			if(tx<0||ty<0||tx>=n||ty>=m||g[tx][ty]=='*')	continue;
			if(vis[tx][ty] && yll[tx][ty]>(l - ll - (dy[i]<0)) && ylr[tx][ty]>(r-rr-(dy[i]>0)))	continue;
			if(dy[i]>0 && rr+1>r)	continue;
			if(dy[i]<0 && ll+1>l)	continue;
			vis[tx][ty]=true;
			yll[tx][ty]=max((int)yll[tx][ty],l-ll-(dy[i]<0));
			ylr[tx][ty]=max((int)ylr[tx][ty],r-rr-(dy[i]>0));
			q.push({
   tx,ty,ll+(dy[i]<0),rr+(dy[i]>0)});
		}
	}
}	
int main()
{
   	
	cin >> n >>m;
	cin >> sx >> sy;
	cin >> l >> r;
	for(int i=0;i<n;i++)
		cin>>g[i];	
	int res=0;
	bfs();	
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			res+=vis[i][j];
	cout<<res<<endl;
	return 0;

}

原因是bfs过程中能走的不一定是最优的,也就是先到的点不一定是最优的,由于vis数组的原因,他会把后到的优秀的点给排掉,那么我们需要一个最优数组,分别记录走到该点能(左右)继续走最多的路数
代码:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=2020;
char g[N][N];
struct nn{
   
	int ll;
	int rr;
};
nn yl[N][N];
bool vis[N][N];
int n,m;
int sx,sy;
int l,r;
struct node{
   
	int x;
	int y;
	int lst;
	int rst;
};
int dx[4]={
   0,0,1,-1},dy[4]={
   1,-1,0,0};
void bfs()
{
   
	queue<node>q;
	q.push({
   sx-1,sy-1,0,0});
	vis[sx-1][sy-1]=true;
	yl[sx-1][sy-1].ll=l;
	yl[sx-1][sy-1].rr=r;
	while(q.size())
	{
   
		auto t=q.front();
		q.pop();
		int x=t.x;
		int y=t.y;
		//cout<<x<<' '<<y<<endl;
		int ll=t.lst;
		int rr=t.rst;
		//cout<<x<<' '<<y<<' '<<ll<<' '<<rr<<endl;
		for(int i=0;i<4;i++)
		{
   
			int tx=x+dx[i];
			int ty=y+dy[i];
			if(tx<0||ty<0||tx>=n||ty>=m||g[tx][ty]=='*')	continue;
			if(vis[tx][ty] && yl[tx][ty].ll>=(l-ll-(dy[i]<0)) && yl[tx][ty].rr>=(r-rr-(dy[i]>0)))
				continue;
			if(dy[i]>0 && rr+1>r)	continue;
			if(dy[i]<0 && ll+1>l)	continue;
			vis[tx][ty]=true;
			yl[tx][ty].ll=max(yl[tx][ty].ll,l-ll-(dy[i]<0));
			yl[tx][ty].rr=max(yl[tx][ty].rr,r-rr-(dy[i]>0));
			q.push({
   tx,ty,ll+(dy[i]<0),rr+(dy[i]>0)});
		}
	}
}	
int main()
{
   	
	cin >> n >>m;
	cin >> sx >> sy;
	cin >> l >> r;
	for(int i=0;i<n;i++)
		cin>>g[i];	
	int res=0;
	bfs();	
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			res+=vis[i][j];
	cout<<res<<endl;
	return 0;

}