码迷,mamicode.com
首页 > 其他好文 > 详细

迷宫问题

时间:2020-01-25 15:37:12      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:先进先出   new   har   color   mem   for   amp   ++   自己   

之前写的东西因为断网没了(心态爆炸。。。)

总之用宽搜解决迷宫问题就是用队列先进先出的特点,一旦找到了结果一定是最短的(结合树状图自己理解)

代码如下

#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdio>
using namespace std;
bool vis[45][45];
char map[45][45];
int n, m;
struct node{
    int x, y, step; //横纵坐标、到这个格子走了多少步
};
bool isok(int x, int y)
{
    if (x >= 0 && x < n && y >= 0 && y < n && !vis[x][y])
        return 1;
    return 0;
}
int main()
{
    while(scanf("%d%d",&n, &m) != EOF) {
        for (int i = 0; i < n; ++i)
            scanf("%s", map[i]);    //绘制地图
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < m; ++j)
                if(map[i][j] == #)
                    vis[i][j] = 1;
                else
                    vis[i][j] = 0;
        //初始化
        queue<node> q;
        node point, newpoint;
        point.x = 0;
        point.y = 0;
        point.step = 1;

        //队列登场!
        q.push(point);
        while(!q.empty()) {
            point = q.front();
            q.pop();
            if(point.x == n-1&&point.y == m-1)
                cout << point.step << endl; //找到了直接输出,因为宽搜出来的结果一定是最短的
            for (int i = -1; i <= 1; ++i)
                for (int j = -1; j <= 1; ++j)
                    if(abs(i)+abs(j) == 1 && isok(point.x + i, point.y + j) ) {
                        newpoint.x = point.x + i;
                        newpoint.y = point.y + j;
                        vis[newpoint.x][newpoint.y] = 1;
                        newpoint.step = point.step + 1;
                        q.push(newpoint);
                    }
        }
    }
    return 0;
}

 

迷宫问题

标签:先进先出   new   har   color   mem   for   amp   ++   自己   

原文地址:https://www.cnblogs.com/xdaniel/p/12233049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!