广搜水题_Poj_3984

//该题主要是学会任何在广搜的过程中,记录下最短的那条路径
//方法:队列中的任何一个节点的前驱节点唯一,利用这一点,记录下前驱节点并深搜输出


#include<iostream>
#include<queue>
using namespace std;

//定义节点
struct Node
{
int value;
int x,y;
int pre_x,pre_y;//前驱节点。因为后继节点可能多个,但前驱节点唯一
bool sign;
}node[5][5];

//定义队列
queue<Node>Q;

//定义四个方向的想,x和y的变化
int go_x[4]={-1,0,1,0};
int go_y[4]={0,1,0,-1};

//判断是否在图内
bool IsIn(int x,int y)
{
if(x<0||x>4||y<0||y>4) return false;
else return true;
}

//广搜,搜索最短路
void bfs()
{
int now_x,now_y,i,tx,ty;
now_x=Q.front().x,now_y=Q.front().y;
for(i=0;i<4;i++)
{
tx=now_x+go_x[i],ty=now_y+go_y[i];
if(IsIn(tx,ty) && !node[tx][ty].sign && node[tx][ty].value!=1)
{
node[tx][ty].pre_x=now_x;
node[tx][ty].pre_y=now_y;
node[tx][ty].sign=true;
Q.push(node[tx][ty]);
}
}
Q.pop();
while(!Q.empty())
{
now_x=Q.front().x,now_y=Q.front().y;
if(now_x==4 && now_y==4) return;//如果已经到达重点则返回
for(i=0;i<4;i++)
{
tx=now_x+go_x[i],ty=now_y+go_y[i];
if(IsIn(tx,ty) && !node[tx][ty].sign && node[tx][ty].value!=1)
{
node[tx][ty].pre_x=now_x;
node[tx][ty].pre_y=now_y;
node[tx][ty].sign=true;
Q.push(node[tx][ty]);
}
}
Q.pop();
}
}

//深搜,搜索一路走来的路径
void dfs(int x,int y)
{
int pre_x=node[x][y].pre_x;
int pre_y=node[x][y].pre_y;
//如果有祖先,则搜索祖先
if(pre_x!=-1 && pre_y!=-1)
dfs(pre_x,pre_y);
//输出自己的地址,无论是否有祖先(队列中无祖先的只有【0】【0】点)
printf("(%d, %d)\n",x,y);
}

int main()
{
int i,j;
while(cin>>node[0][0].value)
{
//读入数据
for(i=1;i<5;i++)
cin>>node[0][i].value;
for(i=1;i<5;i++)
{
for(j=0;j<5;j++)
  cin>>node[i][j].value;
}
//初始化节点的其他数据
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
node[i][j].pre_x=node[i][j].pre_y=-1;
node[i][j].x=i;
node[i][j].y=j;
node[i][j].sign=false;
}
}
//清空队列
while(!Q.empty())
Q.pop();


node[0][0].sign=true;
Q.push(node[0][0]);
// 搜索最短路径
bfs();
// 输出路径
dfs(4,4);
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值