poj 3984 迷宫问题

点击打开链接

迷宫问题

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 11739   Accepted: 7023

Description

定义一个二维数组: 

int maze[5][5] = {

	0, 1, 0, 0, 0,

	0, 1, 0, 1, 0,

	0, 0, 0, 0, 0,

	0, 1, 1, 1, 0,

	0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

Source

解题思路:

这是一个简单搜索,BFS,一般最短路问题都用BFS,千万不要用DFS啊,

其实搜索说难不难,说简单也不简单,当然这有点抽象就得需要自己仔细体会,

逐行逐行的看代码,其实习惯了也就会了,

下面上代码吧:

/*
2015 - 09 - 11 

Author: ITAK 

Motto:
今日的我要超越昨日的我,明日的我要胜过今日的我,
以创作出更好的代码为目标,不断地超越自己。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int  map[10][10];
int dir[4][2] = {1,0,-1,0,0,1,0,-1};

struct node
{
    int x, y, pre;
} q[100];

void print(int x)///打印
{
    if(q[x].pre != -1)
    {
        print(q[x].pre);///回溯
        cout<<"("<<q[x].x<<", "<<q[x].y<<")"<<endl;
    }
}

void bfs(int x, int y)///广搜
{
    int rear=1, front=0;
    q[front].x = x, q[front].y = y;
    q[front].pre = -1;
    while(front < rear)
    {
        for(int i=0; i<4; i++)
        {
            int dx = q[front].x + dir[i][0];
            int dy = q[front].y + dir[i][1];///判断条件
            if(dx<0 || dx>=5 || dy<0 || dy>=5 || map[dx][dy])
                continue;
            map[dx][dy] = 1;///标记,表示已经走过
            q[rear].x = dx;
            q[rear].y = dy;
            q[rear].pre = front;
            rear++;///入队
            if(dx==4 && dy==4)
                print(front);
        }
        front++;///出队
    }
}
int main()
{
    for(int i=0; i<5; i++)
        for(int j=0; j<5; j++)
            cin>>map[i][j];
    cout<<"(0, 0)"<<endl;

    bfs(0,0);

    cout<<"(4, 4)"<<endl;
    return 0;
}
时间: 2025-01-27 00:21:07

poj 3984 迷宫问题的相关文章

poj 3984 bfs

http://poj.org/problem?id=3984 #include<iostream> #include<stdio.h> #include<cstring> #define Max 0x7f7f7f7f using namespace std; int map[6][6]; int visited[6][6]; int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; int ans[6][6]; int pre[30]; st

杭电 1272 poj 1308 小希的迷宫

这道题是我学了并查集过后做的第三个题,教我们的学姐说这是并查集的基础题,所以有必要牢牢掌握. 下面就我做这道题的经验,给大家一些建议吧!当然,我的建议不是最好的,还请各位大神指出我的错误来,我也好改正. 1.题目概览 这道题是杭电1272,POJ 1308如果写好了代码可以试一试. 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s

【POJ 3009 Curling2.0 迷宫寻径 DFS】

http://poj.org/problem?id=3009 模拟冰壶的移动,给出到达终点的最少投掷次数(不可达时为-1). 具体移动规则如下: 每次选四个方向之一,沿此方向一直前进,直到撞到block或出界或抵达目标位置. 如果撞到block,冰壶停在block的前一个位置,block消失,此时可改变冰壶的移动方向(重新投掷一次): 如果出界,则这条移动路径以失败结束: 如果抵达目标位置,则记录这条移动路径一共投掷的次数. 投掷次数不超过10次的为成功路径. 如果存在成功路径,输出最少的投掷次

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

POJ 3206 Borg Maze:BFS+Prim

Borg Maze:http://poj.org/problem?id=3026 大意:给你一个m*n的迷宫,可以上下左右的走,只能走空格或字母,求出将所有字母连通起来的最小耗费. 思路:先用BFS求出S到所有A的距离,再用Prim求最小生成树,求出最小耗费.这个题坑的不在题,是数据太坑了,在空格处理上没弄好,贡献了好几个WA和CE,看Discuss才知道很坑,最后用G++过了的代码,C++还RE,实在不知道说什么好了  =.= 更多精彩内容:http://www.bianceng.cnhttp

poj分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

迷宫路径输出问题-关于迷宫深度最短路径的问题

问题描述 关于迷宫深度最短路径的问题 #include #include #include #include #include #define N 100 using namespace std; struct node { double hgf; int xy; bool operator<(node other)const { return f } }; int map[N][N];//迷宫,1表示可以走,0表示不可以走 int rowcol;//矩阵的行和列 multiset open;/

迷宫求解非递归 DFS BFS(应用栈和队列)

栈和队列的应用对迷宫问题求解 没有递归 自己手动建的栈和队 并且输出路径 DFS的路径就是 栈中的坐标 BFS的路径在队又开了一个域存上一层的base值 语言还是用的C++ 感觉比C的封装性好很多 充分体会了一下DFS一边比BFS快 但是BFS是最优解而DFS可能不是最优解   #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace

用Photoshop CS做多彩迷宫(多图)

环境支持:Photoshop CS 所需滤镜:云彩.底纹效果.照亮边缘.马赛克 一提到迷宫大家往往会联想到儿童益智游戏,该类游戏在一些报纸上,或儿童书刊上最常见.然而今天我们并不是和大家玩儿迷宫游戏,而是制作一种看似迷宫的彩色纹理,它主要通过4个滤镜结合色彩调整进行制作,效果精致.颜色绚丽. 1. 启动Photoshop CS,新建一个正方形的白底画布,确认前景色为黑色,背景色为白色,执行"滤镜→渲染→云彩"命令,对图像应用云彩滤镜.然后执行"滤镜→艺术效果→底纹效果&quo