BFS还剩下一个最短路径的呈现没搞懂
可惜在学长理解题意以后,好像我思路就是错的,然后我就知道,我算法也理解错了,我一直以来都没理解,只是在套用模板,虽然C和C++的模板都会用,还真是佩服自己的记忆力,但是,我觉得是理解了,一直觉得也理解的不清晰,然后今天发现理解错了。。。
我的问题就是走一步的意思是
1.一大步,就是一步代表上下左右遍历一次的步数;
2.一步一步,往上是一步,往左又是一步......
还是其他。。感觉写了两三天的BFS了,还是好乱啊,这道题目真是一下子反映出我的问题,步不理解。
题目是Codeforces 378c
http://codeforces.com/contest/378/problem/C
#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k,sum;
char s[550][550];
int a[550][550];
struct asd{
int x,y,pre,step;
}p[3000];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void zuosi(int i)
{
if(p[i].pre!=-1)
{
zuosi(p[i].pre);
a[p[i].x][p[i].y]=0; //返回一条走过的路,把路重新标记了0
}
}
int front=0,rear=1;
void bfs(int xx,int yy)
{
p[0].x=xx;
p[0].x=yy;
p[0].step=0;
p[0].pre=-1;
a[xx][yy]=0;
int i;
int aa,bb;
while(front<rear)
{
for(i=0;i<4;i++)
{
aa=dx[i]+p[front].x;
bb=dy[i]+p[front].y;
if(aa<0||aa>=n||bb<0||aa>=n||a[aa][bb])
continue;
a[aa][bb]=1; //标记的时候是1
p[rear].step=p[front].step+1;
p[rear].x=aa;
p[rear].y=bb;
p[rear].pre=front;
rear++;
if(p[rear].step==(sum-k)) //当步数等于规定步数的时候
{
a[aa][bb]=0;
zuosi(front);
}
// printf("%d\n",front);
}
front++;
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
int i,j;
int j1,j2;
sum=0;
for(i=0;i<n;i++)
scanf("%s",s[i]);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(s[i][j]=='#')
a[i][j]=2;
if(s[i][j]=='.')
{
j1=i;
j2=j;
a[i][j]=0;
sum++;
}
}
}
bfs(j1,j2);
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i][j]==0)
printf(".");
if(a[i][j]==1)
printf("X");
if(a[i][j]==2) //原来的墙
{
printf("#");
}
}
printf("\n");
}
}
return 0;
}
相关推荐
为什么 BFS 可以搜索到最短路径
估计很多初学者对这个问题一直不明白,为什么使用 BFS 进行广度搜索,一定可以搜索到最短路径。 讲真,在学校里学习 BFS 的时候,自己也没完全明白为什么。老师这么教,课本这么写,我就这么记。 其实回答这个问题很简单,请大家仔细观察下图,也就是使用 BFS 完成对树的搜索。比如,我要搜索节点 A 到节点 G 的最短路径。如下动图所示: 在 BFS 中,我们使用了数据结构中的一个队列(queue),我们知道队列的特性是 FIFO(First In First Out),也就是先进先出。正是这个 FIFO 特性,保证了我们第一个到达目标节点一定是最短路径。下面解释一下整个 BFS 的过程,我们整
Java实现利用广度优先遍历(BFS)计算最短路径的方法
主要介绍了Java实现利用广度优先遍历(BFS)计算最短路径的方法,实例分析了广度优先遍历算法的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
BFS求最短路径[代码]
本文介绍了如何使用BFS算法求解无权图的单源最短路径问题。文章首先概述了最短路径问题的分类,包括单源最短路径(BFS算法、Dijkstra算法)和各顶点间的最短路径(Floyd算法)。随后详细讲解了BFS算法在无权图中的应用,并提供了代码实现,包括广度优先遍历和求顶点u到其他顶点的最短路径的具体步骤。最后总结了BFS算法的思路,即通过修改BFS算法在访问顶点时记录最短路径长度和前驱结点,并通过示例展示了如何通过path数组回溯最短路径。
算法设计与实验报告—bfs-based 最短路径
这是a BFS-based shortest path program。其中包含算法和程序源代码,完整的实验报告模板。
Python-Graphs:DFS,BFS,Dijkstra的单一来源最短路径
Python图 DFS,BFS,Dijkstra的单一来源最短路径


模式及实现
