算法提高 学霸的迷宫

改自

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

猜你喜欢

转载自blog.csdn.net/qq_36783389/article/details/79502271