您的位置:首页 > 其它

算法提高 学霸的迷宫

2018-03-09 20:19 239 查看
改自 http://blog.csdn.net/youhebke52011/article/details/50300529
ac代码如下在原博主的代码上改了改顺序加了加注释方便自己理解,,

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

struct Node{ //声明结点
int x,y;
int step;
}pre[501][501]; //pre结构体数组保留前驱结点,即保留路径
int ans = 0; //表示结果数
int a[501][501]; //有待输入的地图
int v[501][501]={0}; //记录访问的次数

int n,m;
int dir[4][2] = {{1,0},{0,-1},{0,1},{-1,0}};//四个方向直接按照字典序搜索 及 d l r u

bool check(int x,int y) //检查是否越界
{
if(x<1 || x>n || y<1 || y>m || a[x][y] || v[x][y])
return false;
return true;
}

void bfs(int bx,int by) //广度优先搜索
{
queue<Node> Q; //声明队列
Node p;
Node next;
p.x = bx;
p.y = by;
p.step = 0;
v[bx][by] = 1;
Q.push(p); //放入初始化好的队列
while(!Q.empty()){
p = Q.front(); //取对首元素进行操作
for(int i=0;i<4;i++){ //循环遍历
next = p;
next.x += dir[i][0];
next.y += dir[i][1];
next.step += 1;

if(check(next.x ,next.y)){
Q.push(next);
pre[next.x][next.y].x = p.x;
pre[next.x][next.y].y = p.y;
v[next.x][next.y] = 1;
}
if(next.x == n && next.y == m){
ans = next.step;
pre[next.x][next.y].x = p.x;
pre[next.x][next.y].y = p.y;
return ;
}
}
Q.pop(); //弹出对首元素
}
ans = -1; //找不到队列的话输出保留ans的值为-1
}

void print_road(int x,int y)
{
if(pre[x][y].x == -1)
return ;
print_road(pre[x][y].x,pre[x][y].y);
//printf("%d %d %d %d\n",x,y,pre[x][y].x,pre[x][y].y);
if(x == pre[x][y].x && y > pre[x][y].y)
printf("R");
else if(x > pre[x][y].x && y == pre[x][y].y)
printf("D");
else if(x < pre[x][y].x && y == pre[x][y].y)
printf("U");
else if(x == pre[x][y].x && y < pre[x][y].y)
printf("L");

}

int main()
{

scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%1d",&a[i][j]); //输入技巧每次只输入一个数字
pre[1][1].x = pre[1][1].y = -1;
bfs(1,1);
printf("%d\n",ans);
print_road(n,m);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: