您的位置:首页 > 其它

ZOJ2849 优先队列BFS

2014-03-17 23:20 253 查看
Attack of Panda VirusTime Limit: 3 Seconds Memory Limit: 32768 KB
In recent months, a computer virus spread across networks in China. The virus came with an icon of a lovely panda, hence the name Panda Virus. What makes this virus difficult to handle is that it has many variations.

#include <stdio.h>

struct node{
char flag;//'1' indicates be in virus
int type;
int level;
}num[501][501];

int main(){
int day ,row ,column ;
int i,j,k,flag,num_t,num_flagz;
int sum_Target,target_Type,target_Num;

while(scanf("%d%d",&row,&column)!=EOF){
num_flagz=0;
for(i=1;i<=row;i++){
for(j=1;j<=column;j++){
scanf("%d",&num_t);
if(num_t > 0){
num[i][j].type = num_t;
num[i][j].flag = '1';
}else if(num_t < 0){
num[i][j].level = -num_t;
num[i][j].flag = '0';
num_flagz++;
}
}
}

day = 1;
while(num_flagz != 0){
int times = row * column;
while(times--){
for(i=1;i<=row;i++){
for(j=1;j<=column;j++){
if(num[i][j].flag == '1' || num[i][j].flag == '-1'){
if(i-1>=1 && i-1<=row && j>=1 && j<=column){
if(num[i-1][j].flag == '0' && num[i-1][j].level <= day){
num[i-1][j].flag = '-1';//wait to change
num[i-1][j].type = num[i][j].type;
}
if(num[i-1][j].flag == '-1'){
if(num[i][j].type < num[i-1][j].type)
num[i-1][j].type = num[i][j].type;
}
}
if(i>=1 && i<=row && j-1>=1 && j-1<=column){
if(num[i][j-1].flag == '0' && num[i][j-1].level <= day){
num[i][j-1].flag = '-1';//wait to change
num[i][j-1].type = num[i][j].type;
}
if(num[i][j-1].flag == '-1'){
if(num[i][j].type < num[i][j-1].type)
num[i][j-1].type = num[i][j].type;
}
}
if(i>=1 && i<=row && j+1>=1 && j+1<=column){
if(num[i][j+1].flag == '0' && num[i][j+1].level <= day){
num[i][j+1].flag = '-1';//wait to change
num[i][j+1].type = num[i][j].type;
}
if(num[i][j+1].flag == '-1'){
if(num[i][j].type < num[i][j+1].type)
num[i][j+1].type = num[i][j].type;
}
}
if(i+1>=1 && i+1<=row && j>=1 && j<=column){
if(num[i+1][j].flag == '0' && num[i+1][j].level <= day){
num[i+1][j].flag = '-1';//wait to change
num[i+1][j].type = num[i][j].type;
}
if(num[i+1][j].flag == '-1'){
if(num[i][j].type < num[i+1][j].type)
num[i+1][j].type = num[i][j].type;
}
}
}
}
}
}

num_flagz = 0;
for(i=1;i<=row;i++){
for(j=1;j<=column;j++){
if(num[i][j].flag == '0')
num_flagz++;
}
}

/*
printf("day %d:\n",day);
for(i=1;i<=row;i++){
for(j=1;j<=column;j++){
if(num[i][j].flag == '1' || num[i][j].flag =='-1')
printf("%d ",num[i][j].type);
else if(num[i][j].flag == '0')
printf("0 ");
}
printf("\n");
}
*/
day++;
}

scanf("%d",&sum_Target);
for(int t=0;t<sum_Target;t++){
scanf("%d",&target_Type);
target_Num = 0;
for(i=1;i<=row;i++){
for(j=1;j<=column;j++){
if(num[i][j].flag == '-1' || num[i][j].flag == '1'){
if(num[i][j].type == target_Type)
target_Num++;
}
}
}
printf("%d\n",target_Num);
}
}
return 0;
}


View Code

附加结题报告from:http://blog.csdn.net/yan_____/article/details/8656731

1、被感染的机器防御等级<=天数

2、类型小的优先感染

3、只能感染相邻的

4、一天之内能感染的全部都可以感染完

[cpp] view plaincopyprint?
#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;
}


or from http://www.2cto.com/kf/201311/257413.html

#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int MAX = 510;
struct node
{
int day;
int type;
int x;
int y;
bool friend operator < (node a,node b)
{
if(a.day != b.day)
return a.day > b.day;
return a.type > b.type;
}
};
priority_queue<node> q;
int n,m;
int cnt[MAX*MAX];
int a[MAX][MAX];
int dir[4][2] = {0,1,0,-1,1,0,-1,0};

void bfs()
{
int i;
while(!q.empty())
{
int flag = 0;
node p = q.top();
q.pop();
for(i = 0;i < 4; i++)
{
node t;
t.x = p.x + dir[i][0];
t.y = p.y + dir[i][1];
if(t.x >= 1 && t.x <= n && t.y >= 1 && t.y <= m && a[t.x][t.y] < 0)
{
if(p.day >= a[t.x][t.y] * (-1))
{
t.type = p.type;
t.day = p.day;
a[t.x][t.y] = p.type;
q.push(t);
cnt[p.type]++;
}
else
{
if(a[t.x][t.y] > flag || !flag)
flag = a[t.x][t.y];
}
}
}
if(flag)
{
p.day = -flag;
q.push(p);
}
}
}
int main()
{
int i,j,k,t;
node x;
while(scanf("%d %d",&n,&m)!=EOF)
{
while(!q.empty())
q.pop();
memset(cnt,0,sizeof(cnt));
for(i = 1;i <= n; i++)
{
for(j = 1;j <= m; j++)
{
scanf("%d",&a[i][j]);
if(a[i][j] > 0)
{
x.x = i;
x.y = j;
x.type = a[i][j];
x.day = 1;
cnt[a[i][j]]++;
q.push(x);
}
}
}
bfs();
scanf("%d",&k);
while(k--)
{
scanf("%d",&t);
printf("%d\n",cnt[t]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: