题意:给出一个六面体分为k层,每层n行m列,每个小立方体有'.'(空)与'#'(障碍)的状态,第一层某个空的位置有一个水龙头,水流每次往六个方向流动(...).最少时间水流能把立方体空的部分填满。

思路:从水龙头开始bfs一遍。每步让所有能转移到的空的点入队,总步数即为答案。

#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
struct Nod {
int x;
int y;
int z;
};
char node[][][]; //第几层第几行第几列
int main()
{
int k,n,m;
while(~scanf("%d%d%d",&k,&n,&m)) {
int sum=;
getchar();
getchar();
for(int i=;i<=k;i++) {
for(int j=;j<=n;j++) {
for(int p=;p<=m;p++) {
scanf("%c",&node[i][j][p]);
}
getchar();
}
getchar();
} queue<Nod> q; int sx,sy,nx,ny,nz;
scanf("%d%d",&sx,&sy);
Nod nod;
nod.x=sx;
nod.y=sy;
nod.z=;
q.push(nod);
sum++;
node[][sx][sy]='#'; while(!q.empty()) {
nx=q.front().x;
ny=q.front().y;
nz=q.front().z;
q.pop();
if(ny+<=m && node[nz][nx][ny+]=='.') {
nod.x=nx;nod.y=ny+;nod.z=nz;
q.push(nod);
sum++;
node[nz][nx][ny+]='#';
}
if(ny->= && node[nz][nx][ny-]=='.') {
nod.x=nx;nod.y=ny-;nod.z=nz;
q.push(nod);
sum++;
node[nz][nx][ny-]='#';
}
if(nx+<=n && node[nz][nx+][ny]=='.') {
nod.x=nx+;nod.y=ny;nod.z=nz;
q.push(nod);
sum++;
node[nz][nx+][ny]='#';
}
if(nx->= && node[nz][nx-][ny]=='.') {
nod.x=nx-;nod.y=ny;nod.z=nz;
q.push(nod);
sum++;
node[nz][nx-][ny]='#';
}
if(nz->= && node[nz-][nx][ny]=='.') {
nod.x=nx;nod.y=ny;nod.z=nz-;
q.push(nod);
sum++;
node[nz-][nx][ny]='#';
}
if(nz+<=k && node[nz+][nx][ny]=='.') {
nod.x=nx;nod.y=ny;nod.z=nz+;
q.push(nod);
sum++;
node[nz+][nx][ny]='#';
}
}
cout<<sum<<endl;
}
return ;
}

大腿说太年轻写的如此不优雅,debug很累

#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
struct Nod {
int x;
int y;
int z;
};
char node[][][]; //第几层第几行第几列 int xx[]={,,,,-,};
int yy[]={,,-,,,};
int zz[]={,-,,,,};
int main()
{
int k,n,m;
while(~scanf("%d%d%d",&k,&n,&m)) {
int sum=;
getchar();
getchar();
for(int i=;i<=k;i++) {
for(int j=;j<=n;j++) {
for(int p=;p<=m;p++) {
scanf("%c",&node[i][j][p]);
}
getchar();
}
getchar();
} queue<Nod> q; int sx,sy,nx,ny,nz;
scanf("%d%d",&sx,&sy);
Nod nod;
nod.x=sx;
nod.y=sy;
nod.z=;
q.push(nod);
sum++;
node[][sx][sy]='#'; while(!q.empty()) {
int nx=q.front().x;
int ny=q.front().y;
int nz=q.front().z;
q.pop();
for(int i=;i<;i++) {
int X=nx+xx[i];
int Y=ny+yy[i];
int Z=nz+zz[i]; if(X>= && X<=n && Y>= && Y<=m && Z>= && Z<=k) {
if(node[Z][X][Y]=='.') {
nod.x=X;
nod.y=Y;
nod.z=Z;
q.push(nod);
sum++;
node[Z][X][Y]='#';
}
}
}
}
cout<<sum<<endl;
}
return ;
}

小小优雅后

codeforces 60B bfs的更多相关文章

  1. Arthur and Walls CodeForces - 525D (bfs)

    大意: 给定格点图, 每个'.'的连通块会扩散为矩形, 求最后图案. 一开始想得是直接并查集合并然后差分, 但实际上是不对的, 这个数据就可以hack掉. 3 3 **. .** ... 正解是bfs ...

  2. Police Stations CodeForces - 796D (bfs)

    大意: 给定树, 有k个黑点, 初始满足条件:所有点到最近黑点距离不超过d, 求最多删除多少条边后, 使得原图仍满足条件. 所有黑点开始bfs, 贪心删边. #include <iostream ...

  3. Kilani and the Game CodeForces - 1105D (bfs)

    沙茶bfs打了2小时... queue入队量太大了, 放函数里直接T了, 改成全局46ms #include <iostream> #include <algorithm> # ...

  4. Three Pieces CodeForces - 1065D (BFS)

    链接 大意: n*n棋盘, 每个格子写有数字, 各不相同, 范围[1,n*n], 初始在数字1的位置, 可以操纵knight,bishop,rook三种棋子, 每走一步花费1, 交换棋子花费1, 问按 ...

  5. Fair CodeForces - 987D (bfs)

    链接 大意:给定无向图边权均为1, 每个节点有一种货物, 对于每个节点, 求出拿到$s$种不同货物的最短距离 (每种货物独立计算,并且不用返回) 因为$s$较小, 直接枚举每种货物即可 所以问题就转化 ...

  6. Connected Components? CodeForces - 920E (bfs)

    大意:给定无向图, 求补图的连通块数 bfs模拟即可, 这里用了map存图, set维护未划分的点集, 复杂度$O(nlog^2n)$, 用链表的话可以$O(n)$ #include <iost ...

  7. Board Game CodeForces - 605D (BFS)

    大意: 给定$n$张卡$(a_i,b_i,c_i,d_i)$, 初始坐标$(0,0)$. 假设当前在$(x,y)$, 若$x\ge a_i,y\ge b_i$, 则可以使用第$i$张卡, 使用后达到坐 ...

  8. Codeforces 1105D (BFS)

    题面 传送门 分析 考虑BFS while(棋盘没有满){ for 玩家 p{ 对p进行BFS,走s[p]步 } } 对于每个玩家p BFS的时候如果到了格子(x,y),就把\(vis[x][y]\) ...

  9. World Tour CodeForces - 667D (bfs最短路)

    大意: 有向图, 求找4个不同的点ABCD, 使得d(A,B)+d(D,C)+d(C,A)最大

随机推荐

  1. 涛哥的Python工具箱之批量删除含指定字符串行

    我们在软件研发中不可避免的要用到大量的反复性的繁琐的工作,比如批量改动代码中接口的字符串.批量下载文件并又一次按规则命名.这些工作人工做特别累,尤其是对我这样的懒人来说. 对于一个出色的程序猿来说,反 ...

  2. 基于 Token 的身份验证

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...

  3. asp.net repeater Container.ItemIndex

    <asp:Repeater ID="myRepeater" runat="server"> <HeaderTemplate> <t ...

  4. 钩子编程(HOOK) 安装进程内键盘钩子 (1)

    摘要:钩子能够监视系统或进程中的各种事件消息.截获发往目标窗体的消息并进行处理.这样,我们就能够在系统中安装自己定义的钩子,监视系统中特定事件的发生.完毕特定的功能,比方截获键盘.鼠标的输入.屏幕取词 ...

  5. MIC性能优化策略

    MIC性能优化主要包括系统级和内核级:系统级优化包括节点之间,CPU与MIC之间的负载均衡优化:MIC内存空间优化:计算与IO并行优化:IO与IO并行优化:数据传递优化:网络性能优化:硬盘性能优化等. ...

  6. MIC中函数和变量的声明

    c++/c使用 __declspec(target(mic))函数或变量声明 或 __attribute__((target(mic)))函数或变量声明 举例如下: __attribute__((ta ...

  7. php 判断数组中是否有重复的值

    $input = array(4, "4", "3", 4, 3, "3"); $result = array_unique($input) ...

  8. 判断终端是ios还是安卓的一些妙用

    最近遇到一个项目 要求有两个icon(就是下载地址 下载安卓的apk  和ios的安装包) 一开始的方案是 什么设备都显示这两个icon 但是后来老大说这样不好   安卓用户给他下载ios 也不行  ...

  9. solr6.5的分词

    1.配置solr6.5自带中文分词.复制/usr/local/solr/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-6.5 ...

  10. 2016/05/17 thinkphp3.2.2 分页的使用:①在Home下设置Publics文件夹或在thinkPHP下library的vender 把page.class.php 考贝进入 ②通过new 实例化方式调用 $page=new \Home\Publics\Page($total,3);

    注意分页的方法有两种:一种是thinkphp3.2 自带的   另一种是之前新闻页用过的     显示效果稍有差别 显示效果: 细节问题: ①搜索页面  要加session判断   和  分页 ②修改 ...