bfs记录路径codeforces3a&poj3984

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值