B. Labyrinth(思维,bfs,控制变量)

x , y 向左能走x步,向右能走y步

. 被这两个限制条件搞懵了.如果记录每个点的最优状态

n m n m ! 最多有n*m*n*m种可能!

. 但是实际上根本没这么多.

( q , w ) ( s q , s w ) 比如我从(q,w)走到(sq,sw)

l , r 那么设往走走了l步,往右走了r步

l r = w s w , , 一定是l-r=w-sw,否则到不了这个点,而这是个固定的值

b f s , , 所以记录状态时bfs,只需要其中一个步数少,另一个状态步数也会少

b f s 这就回到了最基本的bfs

#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
const int maxn=2009;
typedef long long ll;
typedef pair<int,int>P;
P vis[maxn][maxn];
int n,m,r,c,x,y;
int sq[5]={0,0,1,-1},sw[5]={1,-1,0,0};
char a[maxn][maxn];
struct p{
	int x,y,l,r;
};
queue<p>q;
int main()
{
	cin >> n >> m >> r >> c >> x >> y;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		cin >> a[i][j];
		vis[i][j].F=vis[i][j].S=-1;
	}
	q.push( (p) {r,c,0,0} );
	vis[r][c].F=vis[r][c].S=0;
	while(!q.empty())
	{
		p u=q.front(); q.pop();
		for(int i=0;i<4;i++)
		{
			int nx=u.x+sq[i],ny=u.y+sw[i];
			if(nx<1||ny<1||nx>n||ny>m)	continue;
			if(a[nx][ny] == '*')	continue;
			p v=u;
			v.x=nx,v.y=ny;
			if(i == 0)	v.r++;
			if(i == 1)	v.l++;
			if(v.l>x||v.r>y)	continue;
			if( vis[nx][ny].F==-1 || (vis[nx][ny].F>v.l) )
			{
				q.push( v );
				vis[nx][ny].F=v.l;
				vis[nx][ny].S=v.r; 
			}
		}
	}
	
	int ans=0;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
		if( vis[i][j].F!=-1 )	ans++;
	cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106816248