主要麻烦在每天等级会上升一级,,每次周围有不能感染的电脑,在该点找到最小能感染的等级入队就好了,然后按优先队列,先考虑等级,再考虑编号进行bfs。。。
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<iomanip>
#include<map>
#include<vector>
#include<queue>
#include<stack>
//#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 1050;
const double PI = 3.1415926;
int mp[550][550];
int vis[550][550];
int dir[][2]= {1,0,-1,0,0,-1,0,1};
int n,m;
int cnt;
int ans[250010];
struct start
{
int x,y;
int bh;
} p[250010];
struct node
{
int x,y;
int bh;
int level;
int day;
bool operator <(const node &b)const
{
if(level==b.level)
return bh>b.bh;
return level>b.level;
}
} st,nx;
void solve()
{
priority_queue<node>q;
for(int i=0; i<cnt; ++i)
{
st.x=p[i].x;
st.y=p[i].y;
st.bh=p[i].bh;
st.level=1;
ans[st.bh]++;
q.push(st);
}
while(!q.empty())
{
node tmp=q.top();
q.pop();
int ff=0;
for(int i=0; i<4; ++i)
{
int xx=tmp.x+dir[i][0];
int yy=tmp.y+dir[i][1];
if( xx<0 || xx>=n || yy<0 ||yy>=m)
continue;
if(mp[xx][yy]>=0)
continue;
if(tmp.level>=(mp[xx][yy]*-1))
{
nx.x=xx;
nx.y=yy;
nx.bh=tmp.bh;
nx.level=tmp.level;
mp[xx][yy]=tmp.level;
ans[tmp.bh]++;
q.push(nx);
continue;
}
if(!ff || mp[xx][yy]>ff)
{
ff=mp[xx][yy];
}
}
if(ff!=0)
{
tmp.level=-ff;
q.push(tmp);
}
}
return ;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(ans,0,sizeof(ans));
cnt=0;
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]>0)
{
p[cnt].x=i;
p[cnt].y=j;
p[cnt++].bh=mp[i][j];
}
}
}
solve();
int que;
scanf("%d",&que);
int bd;
for(int i=0; i<que; ++i)
{
scanf("%d",&bd);
printf("%dn",ans[bd]);
}
}
return 0;
}
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/86 (转载时请注明本文出处及文章链接)


发表评论
快来吐槽一下吧!