HDU 1180 诡异的楼梯 BFS

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
思路:BFS,但是走两步会对结果造成影响,所以我就脑补了如果楼梯的方向不是对的话,就在楼梯上等一分钟,然后接着走,这样要处理下一分钟要走相同的方向。
数据:
1 3
S|T
1 3
S-T
3 4
T…
*-*S
*.|.
3 4
S|.|
-T-.
.|..

输出:

2
1
4
7

http://acm.hdu.edu.cn/showproblem.php?pid=1180

我的代码写得太丑了,还是太弱。
/*********************************************
    Problem : HDU 1180
    Author  : NMfloat
    InkTime (c) NM . All Rights Reserved .
********************************************/

#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

#define rep(i,a,b)  for(int i = (a) ; i <= (b) ; i ++)
#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --)
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next)
#define cls(a,x)   memset(a,x,sizeof(a))
#define eps 1e-8

using namespace std;

const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;

typedef long long LL;
typedef unsigned long long ULL;

struct Node {
    int x,y;
    int t;//经过的时间
    int fa;//方向
    Node(){}
    Node(int _x,int _y,int _t,int _fa = 0) {x = _x ; y = _y ; t = _t; fa = _fa;}
};

int T,n,m,k;
char Map[25][25];
int vis[25][25];
int fx[] = {0,1,-1,0,0};
int fy[] = {0,0,0,-1,1};
int sx,sy;
int tmpx,tmpy;
int ans;
int qiao;

queue<Node>q;

void BFS() {
    while(!q.empty())q.pop();
    q.push(Node(sx,sy,0));
    while(!q.empty()) {
        Node tmp = q.front();
        q.pop();
        if(Map[tmp.x][tmp.y] == 'T') {
            ans = tmp.t;
            break;
        }
        if(Map[tmp.x][tmp.y] == '|' || Map[tmp.x][tmp.y] == '-') {
            q.push(Node(tmp.x+fx[tmp.fa],tmp.y+fy[tmp.fa],tmp.t+1));
            continue;
        }
        rep(i,1,4) {
            tmpx = tmp.x + fx[i] ; tmpy = tmp.y + fy[i];
            if(tmpx >= 1 && tmpx <= n && tmpy >= 1 && tmpy <= m) {
                if(!vis[tmpx][tmpy]) {

                    if(Map[tmpx][tmpy] == '.') {
                        vis[tmpx][tmpy] = 1;
                        q.push(Node(tmpx,tmpy,tmp.t+1));
                    }
                    else if(Map[tmpx][tmpy] == '-') {
                        qiao = 0;
                        tmpx = tmpx + fx[i] ; tmpy = tmpy + fy[i];
                        int tmpt = tmp.t + 1;
                        if(tmpx >= 1 && tmpx <= n && tmpy >= 1 && tmpy <= m && (Map[tmpx][tmpy] == '.' || Map[tmpx][tmpy] == 'T') && vis[tmpx][tmpy] == 0) {
                            if(tmpt % 2 == 0) { // 改变
                                if(i == 3 || i == 4) {
                                    tmpt += 1;
                                    qiao ++;
                                }
                            }
                            else { // 不变
                                if(i == 1 || i == 2) {
                                    tmpt += 1;
                                    qiao ++;
                                }
                            }
                            if(qiao == 0) {
                                vis[tmpx][tmpy] = 1;
                                q.push(Node(tmpx,tmpy,tmpt));
                            }
                            else {
                                q.push(Node(tmp.x+fx[i],tmp.y+fy[i],tmp.t+1,i));
                            }
                        }
                    }
                    else if(Map[tmpx][tmpy] == '|') {
                        tmpx = tmpx + fx[i] ; tmpy = tmpy + fy[i];
                        int tmpt = tmp.t + 1;
                        qiao = 0;
                        if(tmpx >= 1 && tmpx <= n && tmpy >= 1 && tmpy <= m && (Map[tmpx][tmpy] == '.' || Map[tmpx][tmpy] == 'T') && vis[tmpx][tmpy] == 0) {
                            if(tmpt % 2) { // 不变
                                if(i == 3 || i == 4) {
                                    tmpt += 1;
                                    qiao ++;
                                }
                            }
                            else { // 改变
                                if(i == 1 || i == 2) {
                                    tmpt += 1;
                                    qiao ++;
                                }
                            }
                            if(qiao == 0) {
                                vis[tmpx][tmpy] = 1;
                                q.push(Node(tmpx,tmpy,tmpt));
                            }
                            else {
                                q.push(Node(tmp.x+fx[i],tmp.y+fy[i],tmp.t+1,i));
                            }
                        }
                    }
                    else if(Map[tmpx][tmpy] == 'T') {
                        vis[tmpx][tmpy] = 1;
                        q.push(Node(tmpx,tmpy,tmp.t+1));
                    }
                }
            }
        }
    }
}

void input() {
    rep(i,1,n) scanf("%s",&Map[i][1])  ;
}

void solve() {
    rep(i,1,n) rep(j,1,m) {
        if(Map[i][j] == 'S') {
            sx = i; sy = j;
        }
    }
    cls(vis,0); vis[sx][sy] = 1;
    BFS();
    printf("%d\n",ans);
}

int main(void) {
    //freopen("a.in","r",stdin);
    //scanf("%d",&T); while(T--) {
    while(~scanf("%d %d",&n,&m)) {
    //while(scanf("%d",&n),n) {
        input();
        solve();
    }
    return 0;
}
HDU1180-BFS 诡异楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 7782    Accepted Submission(s): 1875 Problem Description Hogwarts正式开学以后,Harry发现在 阅读详情

相关推荐

【Qt】QML-01:使用QtCreator10创建QML工程,并讲解第一个程序:Hello World

QML第一讲:创建QML工程、详解QML第一个程序Hello World

郭老二 7749

HDU1180-诡异楼梯(bfs)

诡异楼梯Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 14348    Accepted Submission(s): 3659Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某

LN1996的博客 706

cutlass2.x源码解读之PitchLinearStripminedThreadMap

TensorCoord:使用layout::PitchLinearCoord作为张量坐标。Shape:使用模板参数Shape_作为tile的形状,kThreads:线程总数,定义为模板参数Threads。kElementsPerAccess:每次访问的元素数,定义为模板参数ElementsPerAccess。ThreadAccessShape:线程访问的形状,使用layout::PitchLinearShape定义。内部实现细节:ShapeVec。

jiangjkd的专栏 760

HDU1180 诡异楼梯[bfs]

E - 诡异楼梯 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.  比如下面

ControlBear的博客 878

hdu 1180 诡异楼梯 bfs

简单的bfs 只是要注意,当楼梯不能通过的时候,可以等带它变过来,这样时间就要加1分钟(位置不变),然后把这个点重新加入队列 View Code #include <stdio.h>#include <queue>using namespace std;struct node{ int x,y,t;}a;int n,m,ex,ey;char ma...

diaopi1575的博客 163

ACM-BFS诡异楼梯——hdu1180

bfs 广度优先搜索 hdu1180

继续激情,继续奋斗。 2020

BfsHDU 1180 诡异楼梯

嗯。。。从结论上来说这道题的数据应该并不卡人,但是要理清楚这个不停摇摆的楼梯还是比较麻烦的。 至少咱在写的时候是感受到的世界的恶意 楼梯是每分钟不断变化的,意思就是说也许原本过不去的地方,站那里等1分钟你就能过去了,所以在入队的时候要加入等待楼梯的操作。 其他的和普通的Bfs没什么区别。 #include #include #include #include

曜雨丶的博客 397

hdu 1180 诡异楼梯 BFS 这题相当坑爹啊,需要注意几点

Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的. Input 测试数据有多组,每组的表述如下: 第一行有两个数,M和N,接下来是

Lionel 1931

HDU - 1180BFS 诡异楼梯

Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具

你若盛开 清风自来 539

HDU1180 诡异楼梯--BFS

中文题目,大家自己去读。 与一般的广搜题目不同的是,这个题目中有一个变数,那就是楼梯的方向,这个地方坑了我好久。 (主要原因是自己手贱,在判断判断楼梯方向与当前方向是否一致的时候,最后没有返回0)。 我的做法是, 如果下一个点是楼梯的话,判断方向与现在所走的方向是否一致,如果一致,那么直接经过楼梯; 如果不一致的话,那么就等待1s钟的时间,让楼梯的方向转过来,使得楼梯的方向与当前

sanmingzi3344的专栏 913

HDU1180诡异楼梯BFS

诡异楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 20219 Accepted Submission(s): 5264 Problem Description Hogwarts正式开学以后,Harry发现在Hogwart...

qq_43555854的博客 272

诡异楼梯 BFS hdu 1180

这题好邪恶啊。做了两个半小时wa得好辛苦。 原因是。。可以停留在空格里的。题意不清啊。 还有就是注意标记。。开了个三维的数组。。分奇数步和偶数步标记。。 最后有可能时间多的先出队。所以要选个最小的时间。。 其实可以用优先队列做。。 艾。。这代码有点太长了。。 #include <stdio.h>#include <string.h>#include <...

weixin_30455365的博客 137

HDU1180 诡异楼梯 BFS

使用优先队列+BFS,坐标搞反,DEBUG一晚上。注意点是从上楼梯楼梯对面的格子只耗时1分钟,另外如果楼梯在t分钟上不去,可以等到t+1分钟上去,最后就是楼梯不用判重,可能会有这种情况,我从楼梯下面到了楼梯上面,接着我又要从楼梯左边到右边。 诡异楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/6

1930

hdu1180诡异楼梯bfs

最近做题缺乏手感,找一道bfs练一练 题目链接 这种题目属于最简单的那种bfs,需要注意的是遇到楼梯时的处理,如果不满足通过楼梯的条件,则需要退回到原位置等待,此时原位置也需要入队。 #include <bits/stdc++.h> using namespace std; char maps[22][22]; bool st[22][22]; int n,m; int dir[][2...

J_M_Kirito的博客 237

hdu 1180 诡异楼梯bfs

小记:阿西吧!我就因为一个dir方向搞错了,写的是

ljd4305的专栏 1231

hdu1180 诡异楼梯--BFS

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1180 需要注意这句话:Harry每秒只能停留在'.'或'S'和'T'所标记的格子内. #define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_Cy1_OVERLOAD_STANDARD_NAMES 1 #include #inclu

半壶老酒 1228

BFSHDU_1180_诡异楼梯

/* 如果要走的方向是竖直方向,楼梯是水平方向的时候是不能走的, 刚开始以为只要走到楼梯就顺着楼梯的方向走。。 如果走的方向跟楼梯方向不一样,可以等一步,到楼梯与走的方向相同,步数+2 一开始没用优先队列,直接找到一个点就输出, 一开始找到的点不一定路径就最短。。 分为4个方向讨论。 */ #include #include #include #include #include

yiluuuuu的博客 269

HDU1180 诡异楼梯bfs)[C,C++]

目录题目及翻译题面输入输出输入样例输出样例提示题目思路注意事项AC代码C/C++(几乎没有代码变更) 题目及翻译 题面 Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的...

扶她小藜 512

hdu1180诡异楼梯(BFS+优先队列)

题目链接: /* 思路:BFS+优先队列 每当遇到楼梯的时候, 1、如果能过 a、通过楼梯后不会超出边界,则走过楼梯 b、通过楼梯后超出边界,则该点不需再入队 2、如果不能通过,时间加1,此点继续入队,等待下一次楼梯变换方向 */ #include #include #include #include #include #incl

no pains,no gains 1304

HDU 1180 诡异楼梯 BFS搜索

诡异楼梯<br />Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)<br />Total Submission(s): 2021    Accepted Submission(s): 484<br /><br /><br />Problem DescriptionHogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方

1082

HDU1180.诡异楼梯.(bfs)

诡异楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 20528 Accepted Submission(s): 5338 Problem Description Hogwarts正式开学以后,Harry发现在Hogwart...

八百标兵奔北坡的博客 357
上一篇: HDU 1175 连连看 BFS
下一篇: HDU 1065 I Think I Need a Houseboat 计算几何
_NMfloat_
博客等级 码龄12年 7粉丝 315原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值