4 条题解
-
0
用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; }
信息
- ID
- 297
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 44
- 已通过
- 18
- 上传者