poj 3984 迷宫问题
来源:互联网 发布:矩阵理论与应用 张跃辉 编辑:程序博客网 时间:2024/06/06 14:23
题目链接http://poj.org/problem?id=3984
Bfs + vis记录路径
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <queue>using namespace std;#define INF 0x3f3f3f3ftypedef long long ll;int go[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int map[5][5];int vis[5][5];typedef struct node{ int x,y;}Node;Node e;queue<Node> q;void Bfs(Node s){ q.push(s); while(!q.empty()){ Node cur=q.front(); q.pop(); if(cur.x==e.x&&cur.y==e.y) return ; for(int i=1;i<=4;i++){ //方向i不能为0 int x=cur.x+go[i-1][0]; int y=cur.y+go[i-1][1]; if(x>=0&&x<5&&y>=0&&y<5&&!map[x][y]&&!vis[x][y]){ vis[x][y]=i;//没访问过才置于访问状态,并标记方向,换句话说,每个点只会被标记一次方向,而且是最先到达这个点的那一个方向, //而且因为配合Bfs,这个方向所指向的路径就是到达这个点的最短路径,所以这个点的vis不需要被更新, //之后到达这个点的路径肯定要更长,就可以直接跳过,所以这里可以用vis同时实现记录访问状态和路径信息的作用 Node tmp; tmp.x=x; tmp.y=y; q.push(tmp); } } }}void print(int x,int y) //函数的涵义:输出以该结点结尾的路径{ //原问题可以划分成 输出以该结点的前驱结点结尾的路径(规模更小的子问题)+ 输出该结点本身 int prex,prey; if(vis[x][y]!=-1){ prex=x-go[vis[x][y]-1][0]; prey=y-go[vis[x][y]-1][1]; print(prex,prey); } printf("(%d, %d)\n",x,y);}int main(){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) cin>>map[i][j]; memset(vis,0,sizeof vis); e.x=4; e.y=4; Node s; s.x=0; s.y=0; vis[s.x][s.y]=-1;//起点vis不能为0,因为起点要置于访问状态,且不能和所有方向i相同 Bfs(s); print(e.x,e.y); return 0;}
0 0
- poj 3984 迷宫问题
- poj 3984 迷宫问题
- POJ-3984-迷宫问题
- Poj 3984 迷宫问题
- 迷宫问题 poj 3984
- poj 3984迷宫问题
- poj 3984 迷宫问题
- POJ-3984-迷宫问题
- poj 3984- 迷宫问题
- POJ 3984 迷宫问题
- poj 3984 迷宫问题
- poj 3984:迷宫问题
- POJ-3984-迷宫问题
- POJ 3984 迷宫问题
- poj 3984迷宫问题
- POJ 3984 迷宫问题
- POJ 3984 迷宫问题
- poj 3984 迷宫问题
- iOS实战演练之——封装图片在上文字在下的button以及相关问题
- File 读取文件
- Mysql主从复制,读写分离
- PAT 1014 Waiting in line
- TF-IDF简易说明
- poj 3984 迷宫问题
- MySQL---数据库从入门走向大神系列(一)-基础入门
- TCP如何保证消息顺序以及可靠性到达
- android studio设置字体大小
- ogg复进程拆分
- MySQL表分区(1)范围分区-range
- 欢迎使用CSDN-markdown编辑器
- CDN(内容分发网络)技术概述
- webView+svg显示