314 - Robot(用Dijkstra怎么还ac不了)

原创 2013年12月04日 14:22:06
#include <cstdio>
#include <cstring>
#include <queue>
#include <string>

using namespace std;

const int N = 55;
const int M = 4;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
const int INF = 0x3f3f3f3f;

struct HeapNode
{
    int x, y, d, dir;
    bool operator < (const HeapNode &other) const
    {
        return d > other.d;
    }
};

int n, m;
bool vis[M][N][N];
int grid[N][N];
int curdir;
int srcx, srcy, dstx, dsty;
char buf[N];
int d[M][N][N];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("e:\\uva_in.txt", "r", stdin);
#endif

    while (scanf("%d%d", &m, &n) == 2 && (n || m)) {
        memset(grid, 0x00, sizeof(grid));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &grid[i][j]);
            }
        }

        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                if (grid[i][j]) {
                    grid[i + 1][j] = grid[i][j + 1] = grid[i + 1][j + 1] = 1;
                }
            }
        }
        scanf("%d%d%d%d%s", &srcx, &srcy, &dstx, &dsty, buf);
        string s = buf;
        if (s == "north") curdir = 0;
        else if (s == "east") curdir = 1;
        else if (s == "south") curdir = 2;
        else curdir = 3;

        //printf("srcx=%d, srcy=%d, dstx=%d, dsty=%d, curdir=%d\n", srcx, srcy, dstx, dsty, curdir);

        if (grid[srcx][srcy] || grid[dstx][dsty]) {
            printf("-1\n");
            continue;
        }

        if (srcx < 0 || srcx >= m || srcy < 0 || srcy >= n) {
            printf("-1\n");
            continue;
        }

        if (dstx < 0 || dstx >= m || dsty < 0 || dsty >= n) {
            printf("-1\n");
            continue;
        }

        priority_queue<HeapNode> q;
        HeapNode node;
        bool found = false;
        node.x = srcx, node.y = srcy, node.d = 0, node.dir = curdir;
        q.push(node);
        memset(d, 0x3f, sizeof(d));
        d[curdir][srcx][srcy] = 0;
        memset(vis, false, sizeof(vis));

        while (!q.empty()) {
            HeapNode tmp = q.top(); q.pop();
            int curx = tmp.x, cury = tmp.y;
            int curdir = tmp.dir;

            //printf("curx=%d, cury=%d, curdir=%d, d=%d\n", curx, cury, curdir, tmp.d);

            if (curx == dstx && cury == dsty) {
                found = true;
                printf("%d\n", tmp.d);
                break;
            }

            if (vis[curdir][curx][cury]) continue;
            vis[curdir][curx][cury] = true;

            int newDir = (curdir + 1) % 4;
            int x = curx, y = cury;
            if (d[curdir][curx][cury] + 1 < d[newDir][curx][cury]) {
                d[newDir][curx][cury] = d[curdir][curx][cury] + 1;
                node.x = x, node.y = y, node.dir = newDir, node.d = d[newDir][curx][cury];
                q.push(node);
            }

            newDir = (curdir + 3) % 4;
            x = curx, y = cury;
            if (d[curdir][curx][cury] + 1 < d[newDir][curx][cury]) {
                d[newDir][curx][cury] = d[curdir][curx][cury] + 1;
                node.x = x, node.y = y, node.dir = newDir, node.d = d[newDir][curx][cury];
                q.push(node);
            }

            newDir = curdir;
            for (int i = 1; i <= 3; i++) {
                x = curx + dx[curdir] * i;
                y = cury + dy[curdir] * i;
                if (x < 0 || x >= m || y < 0 || y >= n) break;
                if (grid[x][y]) break;

                if (d[curdir][curx][cury] + 1 < d[newDir][x][y]) {
                    d[newDir][x][y] = d[curdir][curx][cury] + 1;
                    node.x = x, node.y = y, node.dir = newDir, node.d = d[newDir][x][y];
                    q.push(node);
                }
            }


        }

        if (!found) {
            printf("-1\n");
        }
    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

win8.1 安装华为eNSP最新版本350图文教程 AR/AP/AC不能启动 路径含中文

1.可以先看一下自己的网络适配器 2.官网下载350版本安装    在这里强调安装路径不能含有中文,可能是多数人AR/AC/AP不能正常启动的原因。    (我的路径换过一次,截图没保存)     安...
  • jgy8421d13
  • jgy8421d13
  • 2015年11月24日 11:13
  • 1620

Robot Framework安装及执行用例过程中遇到的问题及解决方法

1.robot framework安装完成后,导入测试用例,发现requestslibrary库标红,并且在log里面看到错误日志提示: 在网上搜了一大圈没发现跟我一样错误的文章,并且在安装目录...
  • Seven__Lau
  • Seven__Lau
  • 2017年06月07日 14:10
  • 1023

AC和AP的区别

WLAN系统一般由AC(接入控制器)和AP(无线接入点)组成。无线AP,为Access Point简称,一般翻译为“无线访问节点”,它是用于无线网络的无线交换机,也是无线网络的核心。无线AP是移动计算...
  • wangzhen_csdn
  • wangzhen_csdn
  • 2017年08月02日 23:04
  • 1812

ac自动机最详细的讲解,让你一次学会ac自动机。

在没学ac自动机之前,觉得ac自动机是个很神奇,很高深,很难的算法,学完之后发现,ac自动机确实很神奇,很高深,但是却并不难。 我说ac自动机很神奇,在于这个算法中失配指针的妙处(好比kmp算法中的...
  • creatorx
  • creatorx
  • 2017年05月02日 19:51
  • 14938

[置顶]AC自动机-算法详解

What's Aho-Corasick automaton?   一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一。   简单的说,KMP用来在一篇文章中匹配一...
  • u013371163
  • u013371163
  • 2017年03月05日 17:35
  • 1137

利用AC自动机进行关键字的提取和过滤

昨天看了meituan.com的AC算法在美团上单系统的应用一文,深受启发,原来ACM算法在工程中也能有这样赤裸裸的运用~~~ 于是便复习了AC自动机,并把代码用java重新搞了一遍~~ AC...
  • asdfghjkl1993
  • asdfghjkl1993
  • 2015年02月01日 15:50
  • 980

Robot(计算最短距离,用Dijkstra算法)

/*Robot(计算最短距离,用Dijkstra算法) 建立邻接表,使用优先队列按照距离入队 */ #include #include #include #include usi...
  • xiehaoyun2012
  • xiehaoyun2012
  • 2013年01月05日 15:38
  • 170

AC自动机的简单Java实现

AC自动机主要实现多模式字符匹配的快速查找,相关知识点为: 1.trie树 2.KMP算法 代码有相关注释,如下: import java.util.ArrayList; import jav...
  • sqh201030412
  • sqh201030412
  • 2017年01月05日 11:15
  • 1500

Python算法实践——AC自动机

初来乍到CSDN,如果要说写博客的原因,想想平日学习编程语言看了那么多别人的博客,也该试着自己写一写了。第一次写博客写不知从何下笔,就从最近写的一个自动机开始吧。...
  • backkom_lory
  • backkom_lory
  • 2016年12月26日 23:01
  • 1195

Robot Framework完整流程学习系列一

一.环境搭建 网上有很多的教程,这里就不多讲了   二.RIDE的界面认识 Framework完整流程学习系列一" title="Robot Framework完整流程学习系列一" width...
  • u011793251
  • u011793251
  • 2017年01月21日 15:41
  • 990
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:314 - Robot(用Dijkstra怎么还ac不了)
举报原因:
原因补充:

(最多只允许输入30个字)