今天组队赛的一道最短路的题,给你一个矩阵,矩阵上有L,R,G,A,分别表示当你到达这个点的时候你要向左,向右,向前,向后走,如果要向别的方向走需要花费1点的魔力,正常情况下走需要花费1点的时间。问花费最小魔力的时候的最少时间是多少。 一个机智的处理方法是向别的方向走的时候的花费1*100000000,然后构图跑最短路出来的结果/100000000就是最小的魔力,%100000000就是最小的时间。

但是比赛的时候WA了好久,赛后RE了好久。终于发现一个严重的问题----队列开小了。

平时最短路都是STL里的队列,这次用了手写的队列,然后手写的队列又没有弄成循环的队列,所以就跪了。写下来警醒自己:

手写队列要小心!!!!!

手写队列要小心!!!!!

手写队列要小心!!!!!

#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <ctime>
using namespace std; #define maxn 120
#define ll long long
int n, m; int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 }; const ll hcost = 100000000; int cd(int k, char cmd){
if (cmd == 'G') return k;
else if (cmd == 'L') return (k + 3) % 4;
else if (cmd == 'R') return (k + 1) % 4;
else return (k + 2) % 4;
} char b[maxn][maxn]; struct Edge{
int v; ll w;
Edge(int vi, ll wi) :v(vi), w(wi){}
Edge(){}
};
vector<Edge> G[maxn*maxn * 8]; int getid(int i, int j, int k){
return 4 * (i*m + j) + k;
} bool in[maxn*maxn * 8];
ll d[maxn*maxn * 8];
bool vis[maxn*maxn * 8]; void spfa()
{
memset(in, 0, sizeof(in));
memset(d, 0x3f, sizeof(d));
memset(vis, 0, sizeof(vis));
in[0] = true; d[0] = 0;
queue<int> que;
que.push(0);
while (!que.empty()){
int u = que.front(); in[u] = false; que.pop();
for (int i = 0; i < G[u].size(); ++i){
int v = G[u][i].v;
ll w = G[u][i].w;
if (d[u] + w < d[v]){
d[v] = d[u] + w;
if (!in[v]) {
que.push(v);
in[v] = true;
}
}
}
}
} int main()
{
//freopen("C.in", "r", stdin);
//freopen("out.txt", "w", stdout);
//double t1 = clock();
while (cin >> n >> m){
for (int i = 0; i < n; ++i){
scanf("%s", b[i]);
}
for (int i = 0; i <= n*m * 6; ++i){
G[i].clear();
}
for (int i = 0; i < n; ++i){
for (int j = 0; j < m; ++j){
for (int k = 0; k < 4; ++k){
int id = getid(i, j, k);
char cmd = b[i][j];
int cord = cd(k, cmd);
int xx, yy;
for (int kk = 0; kk < 4; ++kk){
xx = i + dx[kk]; yy = j + dy[kk];
if (!(xx >= 0 && xx < n&&yy >= 0 && yy < m)) continue;
if (kk == cord) {
G[id].push_back(Edge(getid(xx, yy, kk), 1LL));
}
else{
G[id].push_back(Edge(getid(xx, yy, kk), hcost + 1));
}
}
}
}
}
spfa();
ll ans = 1e15;
for (int i = 0; i < 4; ++i){
int idd = getid(n - 1, m - 1, i);
ans = min(ans, d[idd]);
}
printf("%lld %lld\n", ans / hcost, ans%hcost);
}
//double t2 = clock();
//cout << t2 - t1 << endl;
return 0;
}

NSOJ 鬼泣的更多相关文章

  1. NSOJ A fairy tale of the two(最小费用最大流、SPFA版本、ZKW版本)

    n,m<=20,给两个n×m布尔矩阵,每次操作可将第一个矩阵的2个相邻元素互换.输出最少操作次数使得两个矩阵完全一样. 比赛的时候想过按照二分图完美匹配的类似做法构图,不过想到边太多以及卡各种题 ...

  2. NSOJ 飞船汇合(经典)

    一支分散的飞船舰队,需要汇合到主舰,但是这种飞船在太空中飞行的耗油与质量没有关系,只与发动机打开的时间有关系,为了节省油量,指挥官通知,汇合途中,多台飞船可以串成串飞行,这样只需启动一台发动机,由于安 ...

  3. NSOJ Minimum Transport Cost

    These are N cities in Spring country. Between each pair of cities there may be one transportation tr ...

  4. NSOJ 一个人的旅行(图论)

    虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿 ...

  5. NSOJ Constructing Roads(图论)

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  6. NSOJ 畅通工程(并查集)

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  7. NSOJ 4621 posters (离散化+线段树)

    posters 时间限制: 1000ms 内存限制: 128000KB 64位整型:      Java 类名: 上一题 提交 运行结果 统计 讨论版 下一题 题目描述 The citizens of ...

  8. DEVIL MAY CRY V:《鬼泣5》

    “又是一个带孝子的故事”

  9. VR原理讲解及开发入门

    本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持.   1. VR沉浸感和交互作用产生的原理:   在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...

随机推荐

  1. Python学习教程(learning Python)--3.3.4 Python的if-elif-else语句

    Python的if-elif-else语句用于多种条件判断后选择某个语句块执行.该语句可以利用一系列条件表达式进行检查,并在某个表达式为真的情况下执行相应的代码.需要注意的是,虽然if/elif/el ...

  2. wamp环境搭建

    php 进入php安装目录. 修改php.ini-developement为php.ini 配置扩展目录为你的PHP安装目录下的ext目录,在我这里是 extension_dir = "C: ...

  3. EMVTag系列2《磁条等效数据》

    Ø 57  磁条2等效数据 L: var. up to 19 -M(必备):此数据必须存在并提供给终端,终端在读应用数据过程中,如果没有读到必备数据,终端中止交易 按GB/T 17552,磁条2的数据 ...

  4. Zygote(app_process)相关分析1

    首先我们从Init.c中来看,当Init中解析完init.rc文件时会得到一系列的action,通过action去调用一些函数. Zygote是在init.rc中service section中 se ...

  5. 华硕电脑安装ubuntu出现问题及决方案

    问 题 一:华硕电脑安装ubuntu时无线网络禁用解决方案:打开终端(Ctrl+alt+t)运行命令sudo rmmod acer-wmi,然后开启无线,连接上后便可以上网(附上ubuntu论坛上讨论 ...

  6. Android编程小实验

    1.一个layout中存在相同id的控件会出现什么情况?   结论:编译和运行的时候都不会报错,不过使用findViewById()只会获取第一个该id的控件 来自为知笔记(Wiz)

  7. Netsharp快速入门(之5) 基础档案(之D 实体建模 生成实体代码、同步数据库、配置插件运行时)

    作者:秋时 杨昶   时间:2014-02-15  转载须说明出处 3.3.1  同步数据库并生成dll文件 1.在基础档案和销售管理项目上右击,选择同步数据库结构来创建数据库表 2. 在基础档案项目 ...

  8. Windows准备Node.js运行与开发环境

    如何在Windows环境下搭建Node.js开发环境:1.下载Node.js windows安装版http://www.nodejs.org/download/ 2.正常安装完成后,在系统环境变量已经 ...

  9. 《JavaScript高级程序设计》第3章 基本概念

    3.4 数据类型 3.4.1 typeof操作符 var message = 'some string'; console.log(typeof message); // 'string' conso ...

  10. 【BZOJ】【1503】 【NOI2004】郁闷的出纳员

    Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...