Codeforces 847I

847I - Noise Level

思路:bfs。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))

const int N=255;
char mp[N][N];
ll dp[N][N]={0};
bool vis[N][N]={false};
int n,m,q,p;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
struct node
{
    int x,y,v;
};

vector<node>s;

void bfs(int x,int y,int v)
{
    node now,next;
    queue<node>q;
    now.x=x;
    now.y=y;
    now.v=v;
    q.push(now);
    while(q.size())
    {
        now=q.front();
        dp[now.x][now.y]+=now.v;
        q.pop(); 
        for(int i=0;i<4;i++)
        {
            next.x=now.x+dir[i][0];
            next.y=now.y+dir[i][1];
            next.v=now.v/2;
            if(0<=next.x&&next.x<n&&0<=next.y&&next.y<m&&mp[next.x][next.y]!='*'&&vis[next.x][next.y]==false&&next.v!=0)//判断一下值是不是0可以优化很多 
            {
                vis[next.x][next.y]=true;
                q.push(next);
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>q>>p;
    for(int i=0;i<n;i++)cin>>mp[i];
    
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(isalpha(mp[i][j]))
                s.pb(node{i,j,(mp[i][j]-'A'+1)*q});
    
    for(int i=0;i<s.size();i++)
    {
        vis[s[i].x][s[i].y]=true;
        bfs(s[i].x,s[i].y,s[i].v);
        mem(vis,false);
    }
    
    int res=0;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(dp[i][j]>p)res++;
    cout<<res<<endl;
    return 0; 
} 
原文地址:https://www.cnblogs.com/widsom/p/7569159.html