ACM-生化武器

Posted 小小小的程序媛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM-生化武器相关的知识,希望对你有一定的参考价值。

Description
在一个封闭的房间里,gogo给大家表演了他的屁遁术,人果然一下没影了,但是他留下的“生化武器”,却以每秒1米的速度向上下左右扩散出去。为了知道自己会不会被“毒”到,你果断写了个算法计算出了“毒气”在t秒时间内可以到达的所有地方。Input
有多组测试数据

第一行输入n,m,t(0<n,m<=30)

n和m表示图的行和列,t表示时间 ,‘*’为表演的地点,‘X’是墙,‘.’为空白的地方Output
如果在t秒时间内毒气没有充满房间或刚好充满,输出现在房间里的情况,‘#’表示有‘毒气’的地方

否则,输出“No”

每组数据输出后有一个空行

Sample Input

9 9 4
XXXXXXXXX
X...X...X
X.*.....X
X...X...X
XXXXXXXXX
X.......X
X.......X
X.......X
XXXXXXXXX

5 5 2
XXXXX
X...X
X.*.X
X...X
XXXXX

Sample Output:

XXXXXXXXX
X###X#..X
X######.X
X###X#..X
XXXXXXXXX
X...X
X...X
X...X
XXXXXXXXX

XXXXX
X###X
X###X
X###X
XXXXX

思路:这种题就是纯遍历,用DFS和BFS都可以,这里为了练习BFS,就是用了BFS。

 1 // 生化武器.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 
 6 #include <iostream>
 7 #include <cstring>
 8 #include <queue>
 9 using namespace std;
10 struct Point
11 {
12     int x, y;
13     int time;
14     Point(int xx, int yy, int tt)
15     {
16         x = xx;
17         y = yy;
18         time = tt;
19     }
20 };
21 
22 const int MAX = 100;
23 int n, m, t, uncnt, fillcnt, dir[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0 };
24 char map[MAX][MAX];
25 queue<Point> q;
26 
27 
28 
29 int main()
30 {
31     while (cin>>n>>m>>t)
32     {
33         memset(map, \0, sizeof(map));
34         uncnt = 0;
35         fillcnt = 0;
36 
37         for (int i = 0; i < n; i++)
38             cin >> map[i];
39                 
40         for (int i = 0; i < n; i++)
41         {
42             for (int j = 0; j < m; j++)
43             {
44                 if (map[i][j] == *)
45                 {
46                     Point p(i,j,0);
47                     map[p.x][p.y] = #;
48                     fillcnt++;
49                     q.push(p);    
50 
51                 }
52                 else if (map[i][j] == .)
53                 {
54                     uncnt++;
55                 }
56             }
57         }
58         while (!q.empty() && t)
59         {
60             Point now = q.front();            
61             q.pop();
62             //cout << "now.x:" << now.x << "\tnow.y:" << now.y << "\tnow.t:" << now.time << endl;
63             if (now.time > t) break;
64             for (int i = 0; i < 4; i++)
65             {
66                 int nx = now.x + dir[i][0];
67                 int ny = now.y + dir[i][1];        
68                 //cout << "nx:" << nx << "\tny:" << ny << "\tmap:" << map[nx][ny] << endl;
69                 if (map[nx][ny] == . && nx >= 0 && ny >= 0 && nx < n && ny < m)
70                 {
71                     Point next(nx,ny,now.time+1);
72                     map[next.x][next.y] = #;
73                     fillcnt++;
74                     q.push(next);
75                 }
76             }        
77 
78         }
79         if (uncnt == fillcnt) cout << "No" << endl;
80         else
81         {
82             for (int i = 0; i < n; i++)
83                 cout << map[i] << endl;
84         }
85 
86     }
87 
88     return 0;
89 }

 

 

以上是关于ACM-生化武器的主要内容,如果未能解决你的问题,请参考以下文章

约翰·冯·诺依曼

可爱的编程大佬们的生平

ZOJ 3769 Diablo III(分组背包)

速度与激情:特别行动

《生化少女》国内首款二次元ACG-H5游戏的诞生之路

生化危机6