bfs记录路径的题,以前好像做过类似的,但是忘了怎么写的了。两道题的区别是一个是记录方向一个是每次到达的位置
codeforces3a
题意:给一个起点和终点,问最少要几步到达,并且要输出每一步的方向。
普通的bfs,注意x轴和y轴的选取,这个和方向有关,其实完全可以看作i轴和j轴,i轴是代表数组第一维,也代表竖着的y轴,
j轴相反。这样的话可以想得更清楚,不会搞错。每次要记录方向和上一次的位置,以便能回溯输出答案。
#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
struct node
{
int x, y, step;
};
// 记录方向和上一个位置
struct A
{
int xx, yy;
string dir;
};
A Path[10][10];
int stx, sty, edx, edy;
//八个方向
int d[8][2] = { 1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1 };
//标记数组
bool vis[10][10];
void bfs()
{
queue<node>q;
node st;
st.x = stx; st.y = sty; st.step = 0;
vis[stx][sty] = 1;
//开始的位置,把它的上一个位置设置为-1
Path[stx][sty].xx = -1; Path[stx][sty].yy = -1;
q.push(st);
while (!q.empty())
{
node now = q.front(); q.pop();
if (now.x == edx && now.y == edy)
{
printf("%d\n", now.step);
break;
}
for (int i = 0; i < 8; i++)
{
int nx, ny;
nx = now.x + d[i][0];
ny = now.y + d[i][1];
//符合条件
if (nx > 0 && nx <= 8 && ny > 0 && ny <= 8 && !vis[nx][ny])
{
Path[nx][ny].xx = now.x;
Path[nx][ny].yy = now.y;
if (i == 0)Path[nx][ny].dir = "U";
else if (i == 1)Path[nx][ny].dir = "D";
else if (i == 2)Path[nx][ny].dir = "R";
else if (i == 3)Path[nx][ny].dir = "L";
else if (i == 4)Path[nx][ny].dir = "RU";
else if (i == 5)Path[nx][ny].dir = "LU";
else if (i == 6)Path[nx][ny].dir = "RD";
else Path[nx][ny].dir = "LD";
node t;
t.x = nx; t.y = ny;
t.step = now.step + 1;
vis[nx][ny] = 1;//记得标记
q.push(t);
}
}
}
}
int main()
{
char s1[5], s2[5];
int i, j, k = 0;
string ans[100];
scanf("%s%s", s1, s2);
stx = s1[1] - '0'; sty = s1[0] - 'a' + 1;
edx = s2[1] - '0'; edy = s2[0] - 'a' + 1;
memset(vis, 0, sizeof(vis));
bfs();
//一直回溯,直到起点
for (i = edx, j = edy; i != -1 && j != -1;i=Path[i][j].xx,j=Path[i][j].yy)
{
ans[k++] = Path[i][j].dir;
}
for (i = 0; i < k; i++)
cout << ans[i] << endl;
return 0;
}
poj3984
输出从左上角到右下角的最短路径。
每次输出到达的位置,这个更简单,直接记录位置就好了,不用写字符串什么的。
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
struct node
{
int v,px,py,x,y,step;
};
node mp[10][10];
bool vis[10][10];
int dr[4][2]={1,0,-1,0,0,1,0,-1};
void bfs()
{
queue<node>q;
q.push(mp[0][0]);
vis[0][0]=1;
while(!q.empty())
{
node now=q.front();
q.pop();
if(now.x==4&&now.y==4)break;
int nx,ny;
for(int i=0;i<4;i++)
{
nx=now.x+dr[i][0];ny=now.y+dr[i][1];
if(!vis[nx][ny]&&mp[nx][ny].v==0&&nx>=0&&nx<5&&ny>=0&&ny<5)
{
mp[nx][ny].step=now.step+1;
mp[nx][ny].px=now.x;
mp[nx][ny].py=now.y;
q.push(mp[nx][ny]);
vis[nx][ny]=1;
}
}
}
}
int main()
{
int i,j,ans[200][2]={0};
memset(vis,0,sizeof(vis));
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&mp[i][j].v);
mp[i][j].px=mp[i][j].x=i;
mp[i][j].py=mp[i][j].y=j;
mp[i][j].step=0;
}
}
bfs();
int tx,ty,la,lb;
tx=4;ty=4;j=0;
for(i=0;i<mp[4][4].step;i++)
{
ans[j][0]=tx;ans[j][1]=ty;j++;
la=tx;lb=ty;
tx=mp[la][lb].px;ty=mp[la][lb].py;
}
for(i=mp[4][4].step;i>=0;i--)
printf("(%d, %d)\n",ans[i][0],ans[i][1]);
//system("pause");
return 0;
}