BFS还剩下一个最短路径的呈现没搞懂

keyboarder_zsq 2016-02-02 09:29:45
自己写的一段代码意思就是步数的确定和随便找了个起点,用一个递归就把过去的路径重新标记成是路(在BFS中直接标记成另一种墙(1)了,原来的墙是(2)标记),然后就这样输出。。。
可惜在学长理解题意以后,好像我思路就是错的,然后我就知道,我算法也理解错了,我一直以来都没理解,只是在套用模板,虽然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;
}
...全文
485 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly_dragon_fly 2016-02-03
  • 打赏
  • 举报
回复
谈点看法, 代码粗看了一下, p[0].x=xx; p[0].x=yy; 这里初始错了,没有判重, 两个相邻点会重复加, 另外个人觉得pre没必要,可以先直接把.改成X, bfs时X改成. , step在这里不对, 这不是最小计数,应该是全局的计数
侯壮壮 2016-02-03
  • 打赏
  • 举报
回复
建议以后发问题,直接说输入什么想要的输出什么,你把你思想说半天还得去看你代码理解你的问题,费劲
lilianjie001 2016-02-03
  • 打赏
  • 举报
回复
先把算法原理搞明白,在纸上画一下,然后再去写代码;不明白原理的情况下自己写的Code都搞不明白。 明白算法后单步执行、跟踪调试你的程序。 还是直接把代码修改正确后发给你呢?

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧