队列1(迷宫问题)

Posted O了吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列1(迷宫问题)相关的知识,希望对你有一定的参考价值。

问题描述

给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?

输入

第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符‘.‘表示该位置为空地,字符‘*‘表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2(1 ≤ k ≤ 10, 1 ≤ x1, x2≤ n, 1 ≤ y1, y2≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。

输出

每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。

样例输入

2

5 5

...**

*.**.

.....

.....

*....

1 1 1 1 3

5 5

...**

*.**.

.....

.....

*....

2 1 1 1 3

样例输出

no

yes

#include"iostream"
#include"windows.h"
#include"time.h"
#include"queue"
using namespace std;

void gotoxy(int x, int y) //goto语句  
{  
    COORD pos;  
    pos.X = x;  
    pos.Y = y;  
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);  
}

class Point{
public:
    int x;
    int y;
    int k;                    //转弯次数
    int dire;                //当前方向,上0,下1,左2,右3, -1 表示4个方向(起点)
    Point(int y,int x,int k,int dire){
        this->x = x;
        this->y = y;
        this->k = k;
        this->dire = dire;
    }
};
class Maze{
private:
    char **map;
    int w;
    int h;
public:
    friend void task();
    Maze(int w = 0,int h = 0);
    void deleteMap();
    void initialization();
    int move(int x,int y,int x1,int y1,int k1);
    void show();
    
};

int main(){
    void randMaze();
    randMaze();
//    task();
    return 0;
}
void Maze::initialization(){
    srand(time(NULL));
    for(int i = 0;i < h;i++){
        for(int j = 0;j < w;j++){
            map[i][j] = .;
        }
    }
    for(i = 0;i < h;i++){
        for(int j = 0;j < w;j++){
            if(rand()%4 == 0){
                map[i][j] = *;
            }
        }
    }
    map[0][0] = .;
    map[h - 1][w - 1] = .;
}
void Maze::deleteMap(){
    for(int i = 0;i < h;i++){
        delete[] map[i];
    }
}
Maze::Maze(int w,int h){
    map = new char*[h];
    for(int i = 0;i < h;i++){
        map[i] = new char[w];
    }
    this->w = w;
    this->h = h;
}
void Maze::show(){
    for(int i = 0;i < h;i++){
        for(int j = 0;j < w;j++){
            cout<<map[i][j];
        }
        cout<<endl;
    }
}
int Maze::move(int x,int y,int x1,int y1,int k1){
    queue<Point> q;
    q.push(Point(x,y,0,-1));
    while(!q.empty()){
        Point p = q.front();
        gotoxy(p.x,p.y);cout<<+;Sleep(1);            //动画效果
        if(p.x == w - 1 && p.y == h - 1||p.x == x1&&p.y == y1){
            return p.k;
        }
        if(p.x + 1<w&&map[p.y][p.x + 1]==.){        //右走
            int k = p.k;
            if(p.dire!=3&&p.dire!=-1){
                k++;
            }
            if(k <= k1){
                map[p.y][p.x + 1] = +;
                q.push(Point(p.y,p.x + 1,k,3));
            }
        }
        if(p.y + 1<h&&map[p.y + 1][p.x]==.){        //下走
            int k = p.k;
            if(p.dire!=1&&p.dire!=-1){
                k++;
            }
            if(k <= k1){
                map[p.y + 1][p.x] = +;
                q.push(Point(p.y + 1,p.x,k,1));
            }
        }
        if(p.x > 0&&map[p.y][p.x - 1]==.){        //左走
            int k = p.k;
            if(p.dire!=2&&p.dire!=-1){
                k++;
            }
            if(k <= k1){
                map[p.y][p.x - 1] = +;
                q.push(Point(p.y,p.x - 1,k,2));
            }
        }
        if(p.y > 0&&map[p.y - 1][p.x]==.){        //上走
            int k = p.k;
            if(p.dire!=0&&p.dire!=-1){
                k++;
            }
            if(k <= k1){
                map[p.y - 1][p.x] = +;
                q.push(Point(p.y - 1,p.x,k,0));
            }
        }
        q.pop();
    }
    return -1;
}
void randMaze(){
    int w = 90;
    int h = 20;
    void task();
    Maze m(w,h);
    m.initialization();
    m.show();
    system("pause");
    int n = m.move(0,0,w - 1,h - 1,100);
    gotoxy(0,22);
    cout<<n<<endl;
    m.deleteMap();
}

void task(){
    int h = 5,w = 5,n;
    int k = 1,x1 = 1,x2 = 1,y1 = 1,y2 = 3;
    cin>>n;
    while(n--){
        cin>>w>>h;
        Maze m(w,h);
        for(int i = 0;i < h;i++){
            for(int j = 0;j < w;j++){
                cin>>m.map[i][j];
            }
        }
        cin>>k>>x1>>x2>>y1>>y2;
        if(m.move(x1 - 1,y1 - 1,x2 - 1,y2 - 1,k) != -1){
            cout<<"yes"<<endl;
        }
        else{
            cout<<"no"<<endl;
        }
        m.deleteMap();
    }
}

/*
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3

*/

 

以上是关于队列1(迷宫问题)的主要内容,如果未能解决你的问题,请参考以下文章

使用堆和队列数据结构解决迷宫问题

用队列和栈的知识点解决迷宫问题

数据结构设计——用队列实现迷宫问题的求解

迷宫问题 一个简单队列+dfs

栈与队列应用:迷宫问题(DFS非最短路径)

迷宫问题 - 队列与广度优先搜索