poj3984 广度搜索BFS

迷宫问题

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 27072   Accepted: 15622

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)
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 int map[5][5],len[30],front,sear,x,y,i,j;
 5 struct que
 6 {
 7    int x,y;
 8    int n;
 9
10 }que[30];
11 int xx[]={1,0,-1,0};
12 int yy[]={0,1,0,-1};
13 int bfs()
14 {
15     front=0;sear=0;len[0]=0;que[0].x=0;que[0].y=0;que[front].n=-1;
16     while(front<=sear)
17     {
18         for(i=0;i<4;i++)
19         {
20             x=que[front].x+xx[i];
21             y=que[front].y+yy[i];
22             if(x>=0&&y>=0&&x<5&&y<5&&map[x][y]==0)
23             {
24                 map[x][y]=1;
25                 que[++sear].x=x;
26                 que[sear].y=y;
27                 que[sear].n=front;
28                 len[sear]=len[front]+1;
29                 if(x==4&&y==4)return 1;
30             }
31         }
32         front++;
33     }
34 }
35
36 void myprintf(int x)
37 {
38     if(x==-1)
39     {
40        return;
41     }
42     myprintf(que[x].n);
43     printf("(%d, %d)\n",que[x].x,que[x].y);
44 }
45
46 int main()
47 {
48
49     for(i=0;i<5;i++)
50     {
51         for(j=0;j<5;j++)
52         scanf("%d",&map[i][j]);
53         getchar();
54     }
55     bfs();
56     myprintf(sear);
57     return 0;
58 }


原文地址:https://www.cnblogs.com/carcar/p/8227707.html

时间: 2024-10-17 12:51:03

poj3984 广度搜索BFS的相关文章

广度/宽度优先搜索(BFS)详解

广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名. 一般可以用它做什么呢?一个 广度/宽度优先搜索(BFS) 算法导论里边会给出不少严格的证明,我想尽量写得通俗一点,因此采用一些直观的讲法来伪装成证明,关键的point能够帮你get到就好. 2.图的概念 刚刚说的广度优先搜索是连通图的一种遍历策略,那就有必要将图先简单解释一下.

创建二叉树 树的深度搜索 广度搜索

树的深度搜索 与树的前序遍历同理 根节点->左孩子->右孩子  树的广度搜索 与树的层次遍历同理 一层一层遍历内容 深度搜索 采用stack的适配器 先进后出原则  而广度搜索采用的queue适配器 先进先出原则 二者正好满足 搜索需求 简要代码如下: #include <iostream> #include <stack> #include <queue> #include <malloc.h> using namespace std; typ

八数码问题:C++广度搜索实现

毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限制又会有很多情况无法找到,然后果断放弃,改用广度搜索.  如果要改善代码效率还可以用双向搜索,即从起始状态和最终状态同时搜索,找到相同状态,这样搜索时间会缩短一半.此外还可以用A*(启发式算法)会显得高端很多. 题目要求: 在一个3*3的棋盘上,随机放置1到8的数字棋子,剩下一个空位.数字可以移动到

迷宫-广度搜索

#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};//行走方向

图的深度及广度搜索

今天来学习下,图的遍历方法,我们以下面这个图为例. 开始之前呢,先说个题外话,我们用最常用的二维数组来存这个图,专业的叫法是邻接矩阵法,这好像不是题外话吧!!^_^要不要先自己想一下,上面这个图用邻接矩阵怎么存呢! 废话不多说,先来个深度的吧: 那什么叫深度搜索呢:以一个未访问过的顶点(图由顶点和边组成,不要说你不知道哦!)为起点,沿着当前顶点边走到未访问过的顶点,当没有未访问过的顶点时,回到该顶点的上一个顶点,继续走到其未访问过的顶点,直到所有顶点都被访问过.对文字不太感冒?来看下面的incl

基于C++ STL图的邻接表表示及深度、广度搜索实现

基于C++ STL图的邻接表表示及深度.广度搜索实现,对图论的学习有帮助,代码如下: #include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存

第四章 搜索(深度、广度搜索、全排列、走迷宫、再解炸弹人、宝岛探险、水管工游戏)

一.深度优先搜索DFS 深度优先搜索DFS的关键思想是:当下应该怎么做(每个方法都试一遍),这一步解决后,进入下一步,下一步的解决方法和这一步的解决方法是一样的 DFS的基本模型 void dfs(int step) { 判断边界 尝试每一种可能  for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 1.1全排列 1 //输入一个数n 2 //输出1-n的全排列 3 #include <stdio.h> 4 int n, book[10], a[10

POJ 2329 (暴力+搜索bfs)

Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3943 Accepted: 1210 Description Input is the matrix A of N by N non-negative integers. A distance between two elements Aij and Apq is defined as |i ? p| + |j ? q|. Your pro

hdu 4771 Stealing Harry Potter&#39;s Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: 目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离: 解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点  j 的距离: 然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的: AC代码: 1 #include<iostream>