2 条题解
-
2
这道题可以采用
广搜(BFS)+暴力枚举
。那我们的思路大致如下:
- 输入地图。
- 使用数组标记僵尸、墙壁、以及空地的位置。
- 标记起始点。
- 使用
广搜+暴力枚举
来寻找最多能炸多少僵尸。 - 输出答案。
需要
特别注意
的是在暴力枚举时不要到了一个位置才判断,需要先判断在前进(详见代码)
代码如下:
#include<iostream> #include<queue> using namespace std; int n,m,sx,sy,ans; int xx[4]={-1,0,1,0},yy[4]={0,1,0,-1}; bool qp[2050][2050]; char a[2050][2050]; struct id { int x,y,s; }; queue<id>q; bool check(int x,int y) { if(x<0||y<0||x>n||y>m)return false; if(qp[x][y]==false)return false; return true; } int pd(int x,int y) { int tot=0; int l=x,r=y; while(a[l-1][r]!='#'&&l-1>=1) { if(a[l-1][r]=='G')tot++; l--; } l=x,r=y; while(a[l+1][r]!='#'&&l+1<=n) { if(a[l+1][r]=='G')tot++; l++; } l=x,r=y; while(a[l][r-1]!='#'&&r-1>=1) { if(a[l][r-1]=='G')tot++; r--; } l=x,r=y; while(a[l][r+1]!='#'&&r+1<=m) { if(a[l][r+1]=='G')tot++; r++; } return tot; } int main() { cin>>n>>m>>sx>>sy; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; if(a[i][j]=='#'||a[i][j]=='G')qp[i][j]=false; else qp[i][j]=true; } } q.push(id{sx,sy,0}); qp[sx][sy]=false; while(!q.empty()) { id t=q.front(); q.pop(); for(int i=0;i<4;i++) { int nx=t.x+xx[i]; int ny=t.y+yy[i]; if(check(nx,ny)) { ans=max(ans,pd(nx,ny)); q.push(id{nx,ny,0}); qp[nx][ny]=false; } } } cout<<ans; return 0; }
记得
好评
,球球了!
信息
- ID
- 42
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 9
- 已通过
- 8
- 上传者