杭电acm1180 诡异的楼梯

诡异的楼梯

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 16275 Accepted Submission(s): 4276

Problem Description

Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
 
Input
 
测试数据有多组,每组的表述如下:
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
 
Output
 
只有一行,包含一个数T,表示到达目标的最短时间.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
 
Sample Input
 
5 5 *..T .. ..|.. ... S....
 
Sample Output
 
7
 
Hint
 
Hint
 
地图如下:

image

Solution

这是一个广度优先搜索问题 其中容易被忽略的一点就是当楼梯不可通过时可以在原地等一秒再通过

Code

package acm1180;
 
/**
 * date:2017.12.7
 * author:孟小德
 * function:    杭电acm1180
 *      诡异的楼梯
 */
 
import java.util.*;
 
class Node
{
    int row,column,time;
    public Node(int row,int column,int time)
    {
        this.row = row;
        this.column = column;
        this.time = time;
    }
    public Node(int row,int column)
    {
        this.row = row;
        this.column = column;
    }
}
 
public class Main
{
    public static int[][] map;
    public static boolean[][] visit;
    public static int M,N,time;
    public static Node S,T;
    public static int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
    // public static int flag;     //记录前一次的方向
 
    public static boolean crossBorder(int r,int c)
    {
        if (r < 1 || c < 1 || r > M || c > N)
        {
            return true;
        }
        else if (map[r][c] == 0 || visit[r][c] == true)
        {
            return true;
        }
        return false;
    }
 
    public static void BFS()
    {
        Queue<Node> nodeQ = new LinkedList<Node>();
        nodeQ.add(S);
        while (!nodeQ.isEmpty())
        {
            Node curNode = nodeQ.poll();
            if ((curNode.row == T.row) && (curNode.column == T.column))
            {
                if (curNode.time < time)
                {
                    time = curNode.time;
                }
            }
            for (int i = 0;i<4;i++)
            {
 
                int r = curNode.row + dir[i][0];
                int c = curNode.column + dir[i][1];
                visit[curNode.row][curNode.column] = true;
                if (!crossBorder(r,c))
                {
                    Node temp;
                    if (map[r][c] == 1)
                    {
 
                        temp = new Node(r,c,curNode.time+1);
                        nodeQ.add(temp);
                    }
                    else
                    {
                        while ((curNode.time + i + map[r][c]) % 2 == 0)
                        {
                            curNode.time++;
                        }
                        r += dir[i][0];
                        c += dir[i][1];
                        if (!crossBorder(r,c))
                        {
                            temp = new Node(r,c,curNode.time+1);
                            nodeQ.add(temp);
                        }
                        curNode.time--;
                    }
                }
 
            }
        }
    }
 
 
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
 
        while (input.hasNextInt())
        {
            M = input.nextInt();    //地图行
            N = input.nextInt();    //地图列
            map = new int[M+1][N+1];    //地图信息
            visit = new boolean[M+1][N+1];  //节点是否访问过
 
            input.nextLine();
 
            // 输入
            for (int i=0;i<M;i++)
            {
                String str = input.nextLine();
                char c;
                for (int j=0;j<N;j++)
                {
                    c = str.charAt(j);
                    switch (c)
                    {
                        case '*':
                            map[i+1][j+1] = 0;
                            visit[i+1][j+1] = true;
                            break;
                        case '.':
                            map[i+1][j+1] = 1;
                            visit[i+1][j+1] = false;
                            break;
                        case '-':
                            map[i+1][j+1] = -2;     //时间加上此处的值对2取模,
                            visit[i+1][j+1] = false;
                            break;
                        case '|':
                            map[i+1][j+1] = -1;     //若值为1则楼梯竖,否则横
                            visit[i+1][j+1] = false;
                            break;
                        case 'S':
                            map[i+1][j+1] = 1;
                            visit[i+1][j+1] = false;
                            S = new Node(i+1,j+1,0);
                            break;
                        case 'T':
                            map[i+1][j+1] = 1;
                            visit[i+1][j+1] = false;
                            T = new Node(i+1,j+1);
                            break;
                    }
 
                }
            }
 
            time = 100;
            
            BFS();
            System.out.println(time);
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,279评论 0 10
  • 第一眼见到她,我就知道,知道我喜欢上了这个女子。对了,她是一个风尘女子,一个倚红楼红牌阿姑。 初见时,她神情冷冷淡...
    浅香笑阅读 603评论 0 0
  • 十一月,你好。 傍晚,走在去上自习的路上。 风迎面吹来,即便穿着羽绒服也依然能感觉到冷气直灌颈背。我伸手把衣链完全...
    庄亦柔阅读 472评论 2 1
  • 超链接 : 主要实现页面的跳转、下载、锚点超链接的四个伪类(给元素加入特殊的效果):link visited h...
    树袋熊熊阅读 177评论 0 0
  • 在APP中集成微信的分享功能,官方的说明是在太简洁了.....几乎没法用.... 不过一开始按照官方文档去做没问题...
    吐痰高手阅读 26,636评论 11 34