ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)

//POJ3083
//DFS求靠左墙(右墙)走的路径长+BFS求最短路
//Time:0Ms  Memory:716K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;

#define MAX 45
#define INRANGE(x,y) (x >= 0 && x < n && y >=0 && y < m)

struct Point{
    int x, y, d;
    Point(int xx,int yy,int dd):x(xx), y(yy), d(dd){}
};

int n,m;
int sx,sy;
char mize[MAX][MAX];
bool vis[MAX][MAX];
int mov[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};    //东南西北

int dfs(int x, int y, int f, int c)
{
    if(mize[x][y] == ‘E‘) return 1;
    int px = x + mov[(f+c)%4][0], py = y + mov[(f+c)%4][1]; //左侧(右侧)
    int fx = x + mov[f][0], fy = y + mov[f][1]; //前侧
    if(mize[px][py] == ‘.‘ || mize[px][py] == ‘E‘)
    {
        f = (f+c)%4;    //向左转(向右转)
        fx = x + mov[f][0], fy = y + mov[f][1];
    }
    while(mize[fx][fy] == ‘#‘)
    {
        f = (f+4-c)%4;  //向右转(向左转)
        fx = x + mov[f][0], fy = y + mov[f][1];
    }
    return 1 + dfs(fx,fy,f,c);
}

int bfs(int x, int y)
{
    memset(vis,false, sizeof(vis));
    queue<Point> q;
    q.push(Point(x,y,1));
    vis[x][y] = true;
    while(!q.empty()){
        Point cur = q.front();
        q.pop();
        for(int i =0; i < 4;i++)
        {
            int tx = cur.x + mov[i][0];
            int ty = cur.y + mov[i][1];
            if(INRANGE(tx,ty) && mize[tx][ty] != ‘#‘ && !vis[tx][ty])
            {
                if(mize[tx][ty] == ‘E‘) return cur.d+1;
                q.push(Point(tx,ty, cur.d+1));
                vis[tx][ty] = true;
            }
        }
    }
    return 0;
}

int main()
{
    //freopen("in.txt","r",stdin);

    int T;
    scanf("%d", &T);
    while(T--){
        memset(vis, false, sizeof(vis));
        scanf("%d%d", &m,&n);
        for(int i = 0; i < n;i++)
        {
            scanf("%s", mize[i]);
            for(int j = 0; j < m; j++)
                if(mize[i][j] == ‘S‘) sx = i, sy = j;
        }
        int f = 0;
        for(; f < 4; f++)
        {
            int fx = sx + mov[f][0], fy = sy + mov[f][1];
            if(INRANGE(fx,fy) && mize[fx][fy] == ‘.‘ || mize[fx][fy] == ‘E‘)
                break;
        }

        printf("%d %d %d\n", dfs(sx, sy, f, 3), dfs(sx, sy, f, 1), bfs(sx,sy));
    }
    return 0;
}
时间: 2024-10-16 12:02:58

ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)的相关文章

ACM: FZU 2150 Fire Game - DFS+BFS+枝剪 或者 纯BFS+枝剪

FZU 2150 Fire Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each grid of this boar

ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在于状态转移方程的确立和SPFA的过程 1 //最短路:Floyd+SPFA(BFS)+DP 2 //Time:20Ms Memory:336K 3 //题目很好,数据较弱,网上部分代码有些问题却能够A掉 4 //题意:超级马里奥要从A+B处背着公主以最短路程到达1处,其中1-A是村庄,剩下的是城堡

Hdu 5452 Minimum Cut (2015 ACM/ICPC Asia Regional Shenyang Online) dfs + LCA

题目链接: Hdu 5452 Minimum Cut 题目描述: 有一棵生成树,有n个点,给出m-n+1条边,截断一条生成树上的边后,再截断至少多少条边才能使图不连通, 问截断总边数? 解题思路: 因为只能在生成树上截断一条边(u, v),所以只需要统计以v为根节点的子生成树里的节点与子生成树外的节点的边数就可以了.对于新加入的边(u', v')来说,只影响以LCA(u, v)为根节点的子树里面的节点.统计所有答案,扫一遍输出最小即可.(比赛的时候只统计叶子节点,给水过去了........233

poj3083——dfs+bfs综合题

POJ 3083   dfs+bfs+模拟 Children of the Candy Corn Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10564   Accepted: 4539 Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and must wander through

HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 997    Accepted Submission(s): 306 Problem Description The empire is under attack again. The general of empire is planning to defend his

ACM/ICPC 之 数据结构-邻接表+BFS(TshingHua OJ-无线广播Broadcast)

这道题中若能够构成互不干扰的区域,其构成的图其实就是汉密尔顿路(Hamilton road),因此如果能够观察出来可以直接转化为汉密尔顿路的存在性证明,即便不能观察,我相信ACMer也能转化为BFS问题,这道题是一道很好的图论问题,对考察自己图论的基本功很有帮助. 无线广播(Broadcast) 描述 某广播公司要在一个地区架设无线广播发射装置.该地区共有n个小镇,每个小镇都要安装一台发射机并播放各自的节目. 不过,该公司只获得了FM104.2和FM98.6两个波段的授权,而使用同一波段的发射机

2014 ACM/ICPC Asia Regional Guangzhou Online Wang Xifeng&#39;s Little Plot HDU5024

一道好枚举+模拟题目.转换思维视角 这道题是我做的,规模不大N<=100,以为正常DFS搜索,于是傻乎乎的写了起来.各种条件限制模拟过程 但仔细一分析发现对每个点进行全部八个方向的遍历100X100X100^8 .100X100个点,每个点在走的时候8中选择,TLE 于是改为另一个角度: 以符合要求的点为拐弯点,朝两个垂直的方向走,求出最远的距离.这样只要对每个点各个方向的长度知道,组合一下对应的就OK. 避免了每个点深搜. PS:搜索的时候x,y写反了,导致构图出现问题,以后用[dy][dx]

POJ 3083:Children of the Candy Corn(DFS+BFS)

Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9311 Accepted: 4039 Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and must wander through the maze facing zombies, ch

【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因为广搜需要的就是队列,所以相比递归队列更耗内存? 当然DFS并不像上图所说,需要用栈,而是运用递归即可. BFS: 因为BFS是要一个接一个的遍历,所以用到了结构体,来保存坐标和当前所走步数 1.每走一步,通过定义的结构体,从队列中提取a(即上一步的坐标.步数(步数每次累加)) 2.在a的基础上进行