病毒按照时间的推移感染防御等级不一样的电脑,无法用常规的搜索以时间的改变进行多次计算。这里用了优先队列,在一次搜索的过程中不断更新时间和病毒类型的排列,使得在时间相同的时候先从病毒等级低的节点搜索,否则时间在前面的先搜索。牛逼啊。,没有自己写过优先队列当时居然想不到用这个功能来解决在时间变化的过程中的麻烦。知其然不知其所以然的水平也就是这个程度了,一转眼就要毕业了回顾每天接触的东西 大概也只算是一个入门
#include<iostream>
#include<queue>
#include <cstdio>
#include <cstring>
using namespace std;
struct Node
{
int vi;
int vj;
int day;
int type;
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 dir[4][2] = {-1,0,1,0,0,-1,0,1};
int m,n;
int gra[501][501];
int sum[250002];
void init()
{
int i,j;
Node p;
memset(sum,0,sizeof(sum));
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&gra[i][j]);
if(gra[i][j] > 0)
{
p.vi = i;
p.vj = j;
p.day = 1;
p.type = gra[i][j];
Q.push(p);
sum[gra[i][j]] ++;
}
}
}
}
void bfs()
{
int k,dmax;
Node p,q;
while(!Q.empty())
{
q = Q.top();
Q.pop();
dmax = -111111111;
for(k=0;k<4;k++)
{
p.vi = q.vi + dir[k][0];
p.vj = q.vj + dir[k][1];
if(p.vi>=1 && p.vi<=m && q.vi>=1 && q.vj<=n )
{
if(gra[p.vi][p.vj] < 0 )
{
if( gra[p.vi][p.vj] + q.day >= 0)
{
p.type = q.type;
p.day = q.day;
gra[p.vi][p.vj] = p.type;
Q.push(p);
sum[p.type] ++;
}
else if(gra[p.vi][p.vj] > dmax)//寻找其周围最快传染的机子~
{
dmax = gra[p.vi][p.vj] ;
}
}
}//for(k=0;k<4;k++)
}
if(dmax != -111111111)
{
q.day = dmax * (-1);
Q.push(q);
}
}
}
int main()
{
int a,T;
while(cin>>m>>n)
{
init();
bfs();
cin>>T;
while(T--)
{
scanf("%d",&a);
printf("%d\n",sum[a]);
}
}
return 0;
}
posted on 2011-04-13 18:01
mr_chen 阅读(376)
评论(0) 编辑 收藏 引用 所属分类:
搜索