2 条题解

  • 2
    @ 2022-12-23 15:31:57

    这道题可以采用广搜(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
    上传者