用bfs模拟,本题是朝一个方向一直走,所以需要维护一个路径,还需要维护一个停止的点,因为只需要将到停止的点加入到队列中
#include<cstdio>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<array>
#include<queue>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
using i64=long long;
//using i128=__int128;
const i64 INF=1e18;
const int mod=998244353;
//const int N=1e9+7;
void solve(){
int n,m;
cin>>n>>m;
vector<vector<char> >g(n+1,vector<char>(m+1));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
vector<vector<int> >vis(n+1,vector<int>(m+1)),stop(n+1,vector<int>(m+1));
queue<pair<int,int> >q;
int ans=0;
q.push({2,2});
vis[2][2]=1;
stop[2][2]=1;//记录停止点,将停止点加入到数组中
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
ans++;
while(!q.empty()){
auto [x,y]=q.front();
q.pop();
for(int i=0;i<4;i++){
//由于是要往一个方向移动,所以需要用一个临时变量
int nx=x,ny=y;
vector<pair<int,int> >path;
path.push_back({nx,ny});
while(1){
//一直往一个方向移动,直到撞到石头
int _nx=dx[i]+nx,_ny=dy[i]+ny;
if(_nx<1||_nx>n||_ny<1||_ny>m||g[_nx][_ny]=='#')break;
//记录路径
path.push_back({_nx,_ny});
//更新nx,ny
nx=_nx,ny=_ny;
}
for(auto [_x,_y]:path){
if(!vis[_x][_y]){
vis[_x][_y]=1;
ans++;
}
}
//将终点入队
if(!stop[nx][ny]){
stop[nx][ny]=1;
q.push({nx,ny});
}
}
}
cout<<ans<<'\n';
}
int main(){
int _=1;
//cin>>_;
while(_--)solve();
return 0;
}
0 回复
0 转发
0 喜欢
2 阅读



