BFS简单题套路_Codevs 1215 迷宫

BFS 简单题套路

1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明

const int maxn = 20;
struct Status {
    int r, c;
    Status(int r = 0, int c = 0) : r(r), c(c) {}
//    int DIR;
};
int N;                   //迷宫数量
int W;                   //迷宫宽度
char map[maxn][maxn];    //地图
//方向 : 分别代表 上、右、下、左向量
int dir[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
bool vis[maxn][maxn];
//队列
queue<Status> que;

void input();            //输入数据
bool judge(int r, int c);//判断是否越界, 是否是路
bool check(int r, int c);//判断当前是否到达终点
//移动一步
void Move(const Status& now, int r, int c, int k);
void BFS();              //BFS搜索
void solve();  

2. 随后再逐个函数的实现

//完整代码
/*
 * Codevs 1215 迷宫
 */
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;

const int maxn = 20;
struct Status {
    int r, c;
    Status(int r = 0, int c = 0) : r(r), c(c) {}
//    int DIR;
};
int N;                   //迷宫数量
int W;                   //迷宫宽度
char map[maxn][maxn];    //地图
//方向 : 分别代表 上、右、下、左向量
int dir[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
bool vis[maxn][maxn];
//队列
queue<Status> que;

void input();            //输入数据
bool judge(int r, int c);//判断是否越界, 是否是路
bool check(int r, int c);//判断当前是否到达终点
//移动一步
void Move(const Status& now, int r, int c, int k);
void BFS();              //BFS搜索
void solve();            //启动 

void input()
{
    memset(map, 0, sizeof(map));
    memset(vis, 0, sizeof(vis));
    while (!que.empty()) que.pop();
    scanf("%d", &W);
    getchar();
    for (int i = 0; i < W; i++) {
        scanf("%s", map[i]);
    }
}

bool judge(int r, int c)
{
    return (r >= 0 && r < W) && (c >= 0 && c < W)
            && map[r][c] != ‘#‘;
}

bool check(int r, int c)
{
    return (r == W-1 && c == W-1) && map[r][c] == ‘e‘;
}

void Move(const Status& now, int r, int c, int k)
{
    Status tmp = now;
    int tmpx = tmp.r;
    int tmpy = tmp.c;

    tmpx += dir[k][0];
    tmpy += dir[k][1];

    //判断是否越界, 是否是路, 是否走过
    if (!judge(tmpx, tmpy) || vis[tmpx][tmpy]) return;

    if (check(tmpx, tmpy)) {
        printf("YES\n");
        exit(0);
    }
    vis[tmpx][tmpy] = true;
    que.push(Status(tmpx, tmpy));
}

void BFS()
{
    que.push(Status(0, 0));
    while (!que.empty())
    {
        Status now = que.front(); que.pop();
        int r = now.r, c = now.c;
        for (int k = 0; k < 4; k++) {
            Move(now, r, c, k);
        }
    }
    printf("NO\n");
}

void solve()
{
    scanf("%d", &N);
    while (N--) {
        input();
        BFS();
    }
}

int main()
{
    solve();
    return 0;
}
时间: 2024-12-16 09:19:24

BFS简单题套路_Codevs 1215 迷宫的相关文章

HDU 1253 胜利大逃亡 BFS 简单题

题意: Ignatius要从迷宫的(1,1,1)在时间t内跑到(a,b,c),问可不可能. (题目本来是从(0,0,0)跑到(a-1,b-1,c-1)的) 简单的3维bfs 加剪枝: a+b+c-3>t  速度会快不少. 不过我这里没有加. Input 输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后

HDU2102 A计划 BFS 简单题 有坑点 好题

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出.现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位置

poj 3414 Pots(BFS)(简单题)

Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11551   Accepted: 4900   Special Judge Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i)        f

HDU1548 A strange lift BFS 简单题

一个电梯有n层,每一层有一个数k[i],和2个按钮,UP和DOWN,表示从这一层可以到达i+k[i] 或i-k[i] . 给出a,b,问从a到b 最少需要按多少下按钮. 直接bfs. 1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 const int maxn=210; 6 int n,a,b; 7 int k[maxn]; 8 bool vis[maxn

BFS: 刷题专用

# BFS 刷题 看了一天的图方面的东西,这个东西,真的是,思路都懂,但是实现起来,哈哈哈哈哈哈哈,一直处于懵逼的状态,所以就找点题刷吧,加强理解与应用,突然有点理解高中的应试教育了. POJ 3984 题目描述 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. 题目链接:http://poj.org/problem?id=3984 这个题,其实就是一个基本的BFS搜索,找最短路线,对于BFS.从出发点开始,第一次遍历

wikioi 1215 迷宫

1215 迷宫 6人推荐 收藏 发题解 题目描述 Description 在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走.从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO. 输入描述 Input Description 输入的第一行为一个整数m,表示迷宫的数量.  其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔. 输出

hdu 1253 胜利大逃亡(简单题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题目大意:在所给的时间能顺利离开城堡. 1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <cstring> 5 using namespace std; 6 int map[55][55][55],visit[55][55][55],a,b,c,T; 7 int

Leetcode动态规划【简单题】

目录 Leetcode动态规划[简单题] 53. 最大子序和 题目描述 思路分析 复杂度分析 70.爬楼梯 题目描述 思路分析 复杂度分析 121.买卖股票的最佳时机 题目描述 思路分析 复杂度分析 303.区域和检索-数组不可变 题目描述 思路分析 复杂度分析 Leetcode动态规划[简单题] 动态规划(Dynamic programming,简称DP),是一种把原问题分解为相对简单的子问题的方式求解复杂问题的方法.动态规划相较于递归,拥有更少的计算量. 53. 最大子序和 题目描述 给定一

1215 迷宫

1215 迷宫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走.从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO. 输入描述 Input Description 输入的第一行为一个整数m,表示迷宫的数量. 其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长