题目请点这里

分析:这是一道BFS的模板题,构造一个队列,将每个满足条件的(不超过边界,不超过左右移动次数的限制)位置推入队列,如果不是障碍物且没到达过,就将可到达位置的个数加1

此外,注意这里的输入,输入迷宫的时候是直接输字符串,可以用cin,也可以用getchar()函数

getchar()函数是遇到回车符才会停止,但是它的返回值只有首字符,其他字符都存在缓存区,我们便可以在第一个循环里放一个getchar()来处理回车符,在第二层循环里,实际上只在j=1的时候有输入,

其他时候只不过是读入j=1时存在缓存区里的字符

上代码:

#include <bits/stdc++.h>
using namespace std;
const int inf=<<;
typedef long long ll;
const double pi=acos(-);
const int mod=1e9+;
const int maxn=;
char a[maxn][maxn];
int vis[maxn][maxn];
struct node{
int x,y,lx,ly;
node(int x,int y,int lx,int ly): x(x),y(y),lx(lx),ly(ly){}
};
queue<node> q;
int main(){
int n,m,r,c,x,y;scanf("%d%d%d%d%d%d",&n,&m,&r,&c,&x,&y);
for(int i = ; i <= n; i++) {
getchar();
for(int j = ; j <= m; j++)
a[i][j] = getchar();
}
int ans=;
q.push(node(r,c,x,y));
while(!q.empty()){
node u=q.front();q.pop();
if(vis[u.x][u.y]||a[u.x][u.y]=='*'){
continue;
}
vis[u.x][u.y]=;ans++;
if(u.x>) q.push(node(u.x-,u.y,u.lx,u.ly));
if(u.x<n) q.push(node(u.x+,u.y,u.lx,u.ly));
if(u.y>&&u.lx>) q.push(node(u.x,u.y-,u.lx-,u.ly));
if(u.y<m&&u.ly>) q.push(node(u.x,u.y+,u.lx,u.ly-));
}
cout<<ans<<endl;
return ;
}
05-08 08:25