Sicily.1114 Food Cubes
来源:互联网 发布:淘宝优惠券短链接生成 编辑:程序博客网 时间:2024/05/16 14:40
三维空间上的BFS。(不是自己想出来的,思路是讨论区@TLE from SMIE 同学的。)
需要注意的地方:1.hole不一定是一个点,注意到关键词:continuous ,它可以是任意形状的,只要六个方向都被围住即可。 2.一定要考虑到边界,即"hole"若有一部分是边界,那它便不是hole。
代码如下:
#include <iostream> #include <string> using namespace std; bool grap[101][101][101];//三维空间 //每一个case的边界 int min_x,min_y,min_z; int max_x,max_y,max_z; void reset() { min_x = min_y = min_z = 100; max_x = max_y = max_z = 1; for (int i = 1;i <= 100;i ++) for (int j = 1;j <= 100;j ++) for (int k = 1;k <= 100;k ++) grap[i][j][k] = 0; } void init(int m) { reset(); int x,y,z; for (int i = 0;i < m;i ++) { cin >> x >> y >> z; grap[x][y][z] = 1; //更新边界 min_x = min(x,min_x); max_x = max(x,max_x); min_y = min(y,min_y); max_y = max(y,max_y); min_z = min(z,min_z); max_z = max(z,max_z); } } bool is_side(int x,int y,int z) //判断该点是否为边界点 { if (x == min_x || x == max_x || y == min_y || y == max_y || z == min_z || z == max_z) return true; return false; } bool bfs(int x,int y,int z) { if (grap[x][y][z] == 1) return true;//如果是food cube或者被处理过的"hole"点,返回true if (is_side(x,y,z)) return false;//如果是边界点,返回false grap[x][y][z] = 1;//将hole点标记为1,表示已处理过 bool pd = true; //遍历上下左右前后 pd &= bfs(x,y,z + 1); pd &= bfs(x,y,z - 1); pd &= bfs(x - 1,y,z); pd &= bfs(x + 1,y,z); pd &= bfs(x,y + 1,z); pd &= bfs(x,y - 1,z); return pd; } int findhole() { int cnt = 0; for (int i = min_x;i <= max_x;i ++) for (int j = min_y;j <= max_y;j ++) for (int k = min_z;k <= max_z;k ++) { if (grap[i][j][k] == 0 && bfs(i,j,k)) cnt ++; } return cnt; } int main() { int cases,m; cin >> cases; while(cases --) { cin >> m; init(m); cout << findhole() << endl; } }
阅读全文
1 0
- Sicily 1114 Food Cubes
- Sicily.1114 Food Cubes
- [Sicily 1114 Food Cubes] 广度优先搜索
- 1114 Food Cubes
- 1114 Food Cubes 3D BFS
- soj 1114. Food Cubes
- 1114. Food Cubes
- Sicily 1304. Delivering Food
- Sicily 1114 Food Cube(BFS广度优先搜索)
- 1114. Food Cubes (3D bfs)
- Food
- Food
- Food
- health food
- Fast Food
- Memory Food
- on food
- HDU4292--Food
- APUE 第八章 进程控制
- require.js的用法
- 记一次fis3+react开发经历
- 堆排序
- 实验三 交换机的基本配置与管理
- Sicily.1114 Food Cubes
- C++模板与泛型(3.模板特化)
- 轮播图的实现(上)
- Hibernate Many-to-Many
- 注册账户后可访问私人网盘,树莓派
- 小米手机权限开启方法9
- MySQL Cluster--安装部署性能测试
- sklearn学习记录
- 实验四 交换机的Telnet远程登陆配置