zoukankan      html  css  js  c++  java
  • 迷宫------广度搜索

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

      

  • 相关阅读:
    用CSS3实现上下左右箭头
    让input框只能输入数字
    给内联元素设置宽高的几种方式
    当文本溢出包含的元素时加省略号之text-overflow
    通过box盒子模型给元素内容设置居中
    CSS3中的字体rem
    封装一个取消事件冒泡的方法
    HTML5 web workes实现多线程
    通过imeMode禁用键盘只能输入数字
    jquery的children方法和css3选择器配合使用
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3432004.html
Copyright © 2011-2022 走看看