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.
View Code
附加结题报告from:http://blog.csdn.net/yan_____/article/details/8656731
1、被感染的机器防御等级<=天数
2、类型小的优先感染
3、只能感染相邻的
4、一天之内能感染的全部都可以感染完
or from http://www.2cto.com/kf/201311/257413.html
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; }
相关文章推荐
- Hdu 1242 & Zoj 1649 Rescue (优先队列+BFS)
- ZOJ 649 Rescue(优先队列+bfs)
- ZOJ-2849-Attack of Panda Virus【bfs】【优先级队列】【4th浙江省赛】【好题】
- TOJ 2690 ZOJ 2849 Attack of Panda Virus / 优先队列+广搜
- ZOJ1649/HDU1242_Rescue(BFS/优先队列BFS)
- ZOJ第一题_1649Rescue(优先队列下的BFS)
- HDU 1242 && ZOJ 1649( BFS (队列 || 优先队列)).
- zoj 2849 优先队列bfs 熊猫烧香病毒传播
- zoj 1505 || poj 1198 Solitaire(状态压缩+双向BFS)
- ZOJ 1649 BFS
- ZOJ 1649 Resuce (BFS)
- zoj 3596 BFS+大数简单运算
- zoj 3410 Layton's Escape(优先队列+贪心)
- zoj 1649 bfs
- zoj1649-Rescue (迷宫最短路径)【bfs 优先队列】
- hdu 2757 Ocean Currents(优先队列+bfs)
- ZOJ 3865 Superbot BFS
- zoj 3420 纯bfs
- ZOJ 3652 MAZE(BFS)
- Instrusive hdu 5040 优先队列+BFS