• 迷宫-广度搜索


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

    const int N=100;
    const int M=100;

    typedef struct //定义迷宫结构
    {
    char c; short int p_row,p_col,step;
    }Maze;
    Maze a[N][M];

    bool pathed[N][M]; //留下足迹数组
    short int p[4][2]={-1,0,0,1,1,0,0,-1};//行走方向数组
    int n,m;//行列变量
    int bfs(int,int);

    typedef struct //定义队列结构
    {
    int row,col,step;
    } queue_type;
    queue_type queue[N*M];

    void bfs(int n,int m,int b_i,int b_j,int e_i,int e_j)
    {
    memset(pathed,0,sizeof(pathed));//足迹数组赋初始值

    int row,col,start=0,end=1,;//队列的初始位置
    queue[start].row=b_i, queue[start].col=b_j, queue[start].step=a[b_i][b_j].step=0; //开始位置入队列
    pathed[b_i][b_j]=1; //留下足迹

    while(start<end)
    {
    for(int i=0;i<4;i++)
    {
    row=queue[start].row+p[i][0],col=queue[start].col+p[i][1];
    if(row>=0 && row<n && col>=0 && col<m && pathed[row][col]==0 && a[row][col].c!='#')
    {
    pathed[row][col]=1; //留下足迹
    queue[end].row=row,queue[end].col=col,queue[end].step=queue[start].step+1; //加到队列的尾部

    a[row][col].step=queue[end].step; //写入步数
    a[row][col].p_row=queue[start].row,a[row][col].p_col=queue[start].col; //记下父节点
    end++;
    if(row==e_i && col==e_j) //找到满足条件解,返回
    return;
    }
    }
    start++;
    }
    }

    void out_path(int b_i,int b_j,int e_i,int e_j)
    {
    if(e_i==b_i && e_j==b_j)
    {printf("(%d,%d)",b_i,b_j); return ;}
    else
    out_path(b_i,b_j,a[e_i][e_j].p_row,a[e_i][e_j].p_col);
    printf("-->(%d,%d)",e_i,e_j);
    }

    int main()
    {
    int i,j,n,m,b_row,b_col,e_row,e_col;
    cout<<"请输入行、列值"<<endl;
    cin>>n>>m;
    cout<<"构造迷宫"<<endl;
    for(i=0;i<n;i++)
    for(j=0;j<m;j++)
    { cin>>a[i][j].c; a[i][j].step=-1;}

    cout<<"请输入开始点"<<endl;
    cin>>b_row>>b_col;
    cout<<"请输入结束点"<<endl;
    cin>>e_row>>e_col;
    bfs(n,m,b_row,b_col,e_row,e_col);
    for(i=0;i<n;i++)
    {
    cout<<endl;
    for(j=0;j<n;j++)
    printf("%4d",a[i][j].step);
    }
    cout<<endl<<endl;
    if(a[e_row][e_col].step==-1)
    cout<<"No path!"<<endl;
    else
    {out_path(b_row,b_col,e_row,e_col);cout<<endl;}
    }

  • 相关阅读:
    LInux 安全测试 2
    LInux 安全测试
    又一款linux提权辅助工具
    shell 生成指定范围随机数与随机字符串 .
    腾讯新浪通过IP地址获取当前地理位置(省份)的接口
    建站指南:百度认为什么样的网站更有抓取和收录价值2012-06-20
    ngx_lua 金山项目 黄雀
    在页面中使用js
    多线程取读文件(别人的,有点晕,先放在这里有时间研究研究)
    factory工厂模式
  • 原文地址:https://www.cnblogs.com/2014acm/p/3901511.html
Copyright © 2020-2023  润新知