1、被感染的机器防御等级<=天数
2、类型小的优先感染
3、只能感染相邻的
4、一天之内能感染的全部都可以感染完
#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 1<<30
using namespace std;
struct node{
int day;
int type;
int x;
int y;
friend bool operator <(node a,node b)
{
if(a.day!=b.day)
return a.day>b.day;
else
return a.type>b.type;
}
};
priority_queue<node> q;
int m,n;
int map[555][555];
//int sum[250010];
int sum[250010];
int move[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void bfs()
{
int i,j,k;
while(!q.empty())
{
k=0;
node p=q.top();
node t;
q.pop();
k=-INF;
for(i=0;i<4;i++)
{
t.x=p.x+move[i][0];
t.y=p.y+move[i][1];
if(t.x>0&&t.x<=m&&t.y>0&&t.y<=n&&map[t.x][t.y]<0)
{
if(map[t.x][t.y]+p.day>=0)//可以被感染
{
t.type=p.type;
t.day=p.day;
q.push(t);
sum[t.type]++;
map[t.x][t.y]=t.type;
}
else
{
if(map[t.x][t.y]>k)
k=map[t.x][t.y];
}
}
}
if(k!=-INF)
{
p.day=k*(-1);
q.push(p);
}
}
}
int main()
{
int i,j,k,l;
while(~scanf("%d %d",&m,&n))
{
memset(sum,0,sizeof(sum));
memset(map,0,sizeof(map));
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]>0)
{
node p;
p.day=1;
p.type=map[i][j];
p.x=i;
p.y=j;
sum[p.type]++;
q.push(p);
}
}
}
bfs();
scanf("%d",&k);
for(i=0;i<k;i++)
{
int t;
scanf("%d",&t);
printf("%d\n",sum[t]);
}
}
return 0;
}