一看就是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;
}