POJ - 3984 迷宫问题(bfs+路径标记)
定义一个二维数组:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
我做了一周的搜索了 kuangbin专题还没全绿 yingyingying 我想口土
bfs+路径标记
NO1.
pair<int,int>path[20][20]来存路径,vis[20][20]像以前一样来标记该点有没有走过,其他没有什么特别的。
如果要输出步数的话可以把pair换成 结构体(本坐标、前驱坐标、步数)或者再开一个 step的二维数组 来存储每一点的步数。
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
int a,b,c;
int dir[4][4]={
{1,0},{-1,0},{0,1},{0,-1}};
bool vis[20][20];
int mp[20][20];
pair<int,int>path[20][20];
void putout(int x,int y)
{
if(x==0&&y==0)
return ;
else
{
putout(path[x][y].first,path[x][y].second);
printf("(%d, %d)\n",path[x][y].first,path[x][y].second);
}
if(x==4&&y==4)
printf("(4, 4)\n");
}
void bfs()
{
queue<pair<int,int> >q;
q.push(make_pair(0,0));
vis[0][0]=1;
while(q.size())
{
pair<int,int>n=q.front();
q.pop();
if(n.first==4&&n.second==4)
return ;
for(int i=0;i<4;i++)
{
pair<int,int>tmp;
int l=n.first+dir[i][0];
int r=n.second+dir[i][1];
tmp.first=l;
tmp.second=r;
if(!mp[l][r]&&!vis[l][r]&&l>=0&&l<=4&&r>=0&&r<=4)
{
q.push(tmp);
vis[l][r]=1;
path[l][r].first=n.first;
path[l][r].second=n.second;
if(l==4&&r==4)
return ;
}
}
}
}
int main()
{
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
scanf("%d",&mp[i][j]);
memset(vis,0,sizeof(vis));
bfs();
putout(4,4);
return 0;
}
总结:
1.只输出路径:(1)开pair<>数组,存储前驱坐标 (2)struct内添加前驱
2.只输出步数:(1)struct添加step (2)mp数组存每一点步数
3.输出路径和步数:(1)pair<>存路径+mp[][]存步数 (2)struct存 当前坐标、前驱坐标、步数
先写个小总结。
NO2 NO3 未完待续 有空回来补
咕了
我又回来了!!!!!
NO2.结构体存:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4.5e6+20;
bool vis[10][10];
int a[10][10];
int tot;
int dir[4][2]={
{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
int x,y,id,pre;
}s[50];
void bfs(node n)
{
queue<node>q;
q.push(n);
vis[n.x][n.y]=1;
while(q.size())
{
node tmp=q.front();
q.pop();
if(tmp.x==4&&tmp.y==4)
return;
for(int i=0;i<4;i++)
{
int fx=tmp.x+dir[i][0];
int fy=tmp.y+dir[i][1];
if(fx>=0&&fx<5&&fy>=0&&fy<5&&!a[fx][fy]&&!vis[fx][fy])
{
vis[fx][fy]=1;
s[++tot].x=fx;
s[tot].y=fy;
s[tot].id=tot;
s[tot].pre=tmp.id;
q.push(s[tot]);
if(fx==4&&fy==4)
return ;
}
}
}
}
void push(int id)
{
if(id==0)
return ;
push(s[id].pre);
cout<<'('<<s[id].x<<", "<<s[id].y<<')'<<'\n';
}
int main()
{
memset(a,0,sizeof(a));
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
scanf("%d",&a[i][j]);
s[1].x=0;
s[1].y=0;
s[1].id=1;
s[1].pre=0;
s[1].id=1;
tot=1;
bfs(s[1]);
push(s[tot].id);
return 0;
}