非常基本的BFS模板题,忘记了BFS模板的话就回来看看吧。
大致题意就是是一个三维的数组然后从入口找出口嘛!
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; char map[31][31][31]; int c,l,r; int is,js,ks; int d[31][31][31] ;//到起点的距离的数组 bfs的作用本质上就是更新这个数组的过程哦 struct node{ int nl; int nr; int nc; node() {} //如果没有这一句会直接无法定义node u 为什么? 因为有了构造函数吗 node(int x,int y,int z) :nl(x), nr(y),nc(z) {} }; node walk(const node&u,int turn) { if(turn==1) return node(u.nl,u.nr,u.nc-1); //向左走 if(turn==2) return node(u.nl,u.nr,u.nc+1); //向右走 if(turn==3) return node(u.nl,u.nr-1,u.nc) ; //向北走 if(turn==4) return node(u.nl,u.nr+1,u.nc) ; //向南走 if(turn==5) return node(u.nl-1,u.nr,u.nc) ; //向z轴的下走 if(turn==6) return node(u.nl+1,u.nr,u.nc); //向z轴的上走 } void BFS() { queue<node> q; memset(d,-1,sizeof(d)); node u; u.nc=is;u.nl=js; u.nr=ks; d[u.nc][u.nl][u.nr]=0; q.push(u); while(!q.empty()) { node u=q.front(); q.pop(); if(map[u.nc][u.nl][u.nr]==‘E‘) { printf("%d\n",d[u.nc][u.nl][u.nr]); return;} //这里没按题给的那个格式,这题太水了主要把思路捋一遍= = for(int i=1;i<=6;i++) //对于每个点有六种路可以走 { node v=walk(u,i); if(map[v.nc][v.nl][v.nr]!=‘#‘ && v.nc<c && v.nl<l && v.nr<r && d[v.nc][v.nl][v.nr]<0) //判断是否能走的条件,能走就走 { d[v.nc][v.nl][v.nr]=d[u.nc][u.nl][u.nr]+1; q.push(v); } } } } int main() { while(scanf("%d %d %d",&l,&r,&c)&&l&&r&&c) { while(l--) { for(int qi=0;qi<r;qi++) { scanf("%s",&map[qi]); } } int is,js,ks; //寻找初始点S for(int i=0;i<l;i++) for(int j=0;j<r;j++) for(int k=0;k<c;k++) if(map[i][j][k]==‘S‘) { is=i; js=j; ks=k; } BFS(); } }
那在最基本最基本的BFS中我们要注意的是什么呢?
1、BFS函数模板
BFS()
{
创建一个节点node u 各种初始化blabla;
u入node队列 //dfs用递归,bfs就用循环和队列啦
while(队列不空)
{
队列头拿出来,如果是答案就直接return了不是就走呗
for循环,每个结点有几种路就循环几次
node v=walk() 得到新节点
对该节点进行各种条件的判定(记得边界测定哦)
符合了就更新你的信息变量数组Blabla的
新节点入队列
}
2关于node结构体
要记得写构造函数哦事半功倍
然后要有node() {}
才能直接 node u这样去定义一个结构体变量
3
写walk函数或者也有用数组来写的也可以减少编程复杂度
emm好像也没什么别的了,最最基本的bfs模板就是这样啦,今天的任务也完成了(虽然是超级水题dont mind= =)
原文地址:https://www.cnblogs.com/hanny007/p/11576116.html
时间: 2024-10-18 04:20:00