posts - 14,  comments - 4,  trackbacks - 0

病毒按照时间的推移感染防御等级不一样的电脑,无法用常规的搜索以时间的改变进行多次计算。这里用了优先队列,在一次搜索的过程中不断更新时间和病毒类型的排列,使得在时间相同的时候先从病毒等级低的节点搜索,否则时间在前面的先搜索。牛逼啊。,没有自己写过优先队列当时居然想不到用这个功能来解决在时间变化的过程中的麻烦。知其然不知其所以然的水平也就是这个程度了,一转眼就要毕业了回顾每天接触的东西 大概也只算是一个入门

#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<=&& 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)  编辑 收藏 引用 所属分类: 搜索

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年4月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿

随笔档案(14)

文章分类(8)

文章档案(11)

搜索

  •  

最新评论

阅读排行榜

评论排行榜