标签:标准 九度 next 没有 ret 地图 namespace push 最短路
基本操作:
push(x) 将x压入队列的末端
pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值
front() 返回第一个元素(队顶元素)
back() 返回最后被压入的元素(队尾元素)
empty() 当队列为空时,返回true
size() 返回队列的长度
structNode { intx; inty; intstep; Node(intx1,inty1,intstep1):x(x1),y(y1),step(step1){} }; intBFS() { Nodenode(0,0,0); queue<Node>q; while(!q.empty()) q.pop(); q.push(node); while(!q.empty()) { node=q.front(); q.pop(); if(node.x==n-1&&node.y==n-1) { return node.step; } visit[node.x][node.y]=1; for(int i=0;i<4;i++) { int x=node.x+stepArr[i][0]; int y=node.y+stepArr[i][1]; if(x>=0&&y>=0&&x<n&&y<n&&visit[x][y]==0&&mazeArr[x][y]==0) { visit[x][y]=1; Nodenext(x,y,node.step+1); q.push(next); } } } return-1; }
标准模板2;
//给一个地图由起点到点最短步数 .通*不通 //标准广搜模版题 #include<bits/stdc++.h> using namespace std; char mp[103][103]; //地图大小 int vis[103][103]; //访问标记 typedef struct point pt; //点重命名 struct point{int x;int y;}; //点结构体 typedef pair<pt,int> p; //pair存点与距离,方便队列 int dx[4]={0,0,-1,1}; //X偏移,上下左右 int dy[4]={1,-1,0,0}; //Y偏移,上下左右 int main(){ int n,m;cin>>n>>m; //地图大小 pt s,g; //定义起点与终点 for(int i=1;i<=n;i++){ //遍历行 for(int j=1;j<=m;j++){ //遍历列 cin>>mp[i][j]; //输入 if(mp[i][j]==‘s‘){ //如果是起点 s.x=i; //记下X s.y=j; //记下Y } if(mp[i][j]==‘g‘){//如果是终点 g.x=i; //记下X g.y=j; //记下Y } } } queue<p>qu; //开队列 qu.push(p(s,0)); //压入起点 while(!qu.empty()){ //非空 pt nowp=qu.front().first; //读出队首点 int dis=qu.front().second; //读出队首点到起点步数 vis[nowp.x][nowp.y]=1; //打上已访问标记 qu.pop(); //弹出队首 if(nowp.x==g.x&&nowp.y==g.y){cout<<dis<<endl;return 0;} //到终点跳出 for(int i=0;i<4;i++){ //未到终点则四个方向偏移 pt newp; //定义新点 newp.x=nowp.x+dx[i];if(newp.x<1 || newp.x>n)continue; //得新X,超限跳过 newp.y=nowp.y+dy[i];if(newp.y<1 || newp.y>m)continue; //得新Y,超限跳过 if(vis[newp.x][newp.y]==0&&mp[newp.x][newp.y]!=‘*‘){ //未访问且可行 qu.push(p(newp,dis+1)); //新点压入队列 } } } cout<<"impossible"<<endl; //队空都走不到,就肯定走不到了 return 0; }
标签:标准 九度 next 没有 ret 地图 namespace push 最短路
原文地址:https://www.cnblogs.com/lipu123/p/12151693.html