Gym - 101291C (很有意思的最短路)
题意:
给出一张地图和机器人还有出口的位置,地图上面有障碍。然后给出UDLR上下左右四种指令,遇到障碍物或者越界的指令会忽略,剩下的继续执行。
只要到达出口就算找到出口,然后给你一串指令,让你修改指令达到出口,删除或插入任意一个指令花费为1,问让机器人能够找到出口所花费最少。
思路:
感觉很有意思的一道最短路,思路是把每个点分成变成指令长度个点+1,然后就相当于有n^3个点。然后指令是顺序执行的,所以当前点的状态最多到达
周围可到达点的同一状态。所以我们就可以建边,如果我们走到隔壁点的当前状态就相当于插入了一个指令,就当前点到隔壁点建条花费为1的边。还可以建立
当前点到当前点的下个状态的边,花费为1,相当于删除当前指令。
这道题WA了很久= =然后找到数据对拍,最后发现是因为少建了一种边,就是指令执行完了,然后走向下一个点指令执行完了的边没有建立。
代码:
/** @xigua */
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <set>
#include <string>
#include <map>
#include <climits>
#include <bitset>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
const int INF = 1e8 + 5;
const ll inf = 1e15 + 5;
const db eps = 1e-6;
char mapp[55][55], op[55];
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
int n, m;
int cnt, head[maxn], dis[maxn];
struct Edge {
int v, w, next;
bool operator < (const Edge &rhs) const {
return w > rhs.w;
}
} e[maxn*5]; void add(int u, int v, int co) {
e[cnt].v = v;
e[cnt].w = co;
e[cnt].next = head[u];
head[u] = cnt++;
} void init() {
cnt = 0;
memset(head, -1, sizeof(head));
} void dij(int s, int len) {
priority_queue<Edge> pq;
for (int i = 1; i <= len; i++)
dis[i] = INF;
bool vis[maxn] = {0};
dis[s] = 0;
pq.push((Edge){s, 0});
while (!pq.empty()) {
Edge tmp = pq.top(); pq.pop();
if (vis[tmp.v]) continue;
vis[tmp.v] = 1;
for (int i = head[tmp.v]; ~i; i = e[i].next) {
Edge u = e[i];
if (dis[u.v] > dis[tmp.v] + u.w) {
dis[u.v] = dis[tmp.v] + u.w;
pq.push((Edge){u.v, dis[u.v]});
}
}
}
} bool safe(int x, int y) {
return x >= 1 && x <= n && y >= 1 && y <= m && mapp[x][y] != '#';
} void solve() {
while (cin >> n >> m) {
init();
for (int i = 1; i <= n; i++)
scanf("%s", mapp[i] + 1);
scanf("%s", op+1);
int len = strlen(op + 1);
int st, ed;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (mapp[i][j] == 'R') st = (i - 1) * m + j;
if (mapp[i][j] == 'E') ed = (i - 1) * m + j;
if (mapp[i][j] == '#') continue;
for (int k = 1; k <= len; k++) {
for (int p = 0; p < 4; p++) {
int x = i + dx[p];
int y = j + dy[p];
if (safe(x, y)) {
int u = ((i - 1) * m + j) * (len + 1) + k;
int v = ((x - 1) * m + y) * (len + 1) + k;
add(u, v, 1);
}
}
int x = i, y = j;
if (op[k] == 'R') y++;
else if (op[k] == 'L') y--;
else if (op[k] == 'U') x--;
else x++;
if (safe(x, y)) {
int u = ((i - 1) * m + j) * (len + 1) + k;
int v = ((x - 1) * m + y) * (len + 1) + k + 1;
add(u, v, 0);
}
else {
int u = ((i - 1) * m + j) * (len + 1) + k;
add(u, u + 1, 0);
}
int u = ((i - 1) * m + j) * (len + 1) + k;
add(u, u + 1, 1);
}
/* 就是这里 没有考虑到建立边 */
for (int p = 0; p < 4; p++) {
int x = i + dx[p];
int y = j + dy[p];
if (safe(x, y)) {
int u = ((i - 1) * m + j) * (len + 1) + len + 1;
int v = ((x - 1) * m + y) * (len + 1) + len + 1;
add(u, v, 1);
}
}
}
}
dij(st * (len + 1) + 1, (n * m + 1) * (len + 1));
int ans = INF;
for (int i = 1; i <= len + 1; i++) {
int cur = ed * (len + 1) + i;
ans = min(ans, dis[cur]);
}
cout << ans << endl;
}
} int main() {
int t = 1, cas = 1;
//freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
//scanf("%d", &t);
while (t--) {
// printf("Case %d: ", cas++);
solve();
}
return 0;
}
Gym - 101291C (很有意思的最短路)的更多相关文章
- 一行css代码调试中学到的javascript知识,很有意思
现在到处都是JavaScript,每天都能知道点新东西.一旦你入了门,你总能从这里或是那里领悟到很多知识.今天我想分享Addy Osmani的一行代码 ,这行代码对于你调试你的CSS是很有用的.为了可 ...
- We7——很有意思的一个开源CMS
目前做门户.做网站,基本上都需要用到一个系统,那就是CMS内容管理系统:现在开源产品有很多,笔者也是从事这个行业的,国内的各大CMS提供商基本上都试用过,今天向大家推荐一款很有意思的产品——We7CM ...
- 一道很有意思的java线程题
这几天看结城浩的<java多线程设计模式>,跟着做一些习题,有几道题目很有意思,记录下自己的体会. 首先是题目(在原书212页,书尾有解答): public class Main { pu ...
- 一种很有意思的数据结构:Bitmap
昨晚遇到了一种很有意思的数据结构,Bitmap. Bitmap,准确来说是基于位的映射.其中每个元素均为布尔型(0 or 1),初始均为 false(0).位图可以动态地表示由一组无符号整数构成的集合 ...
- 关于Java异常一段很有意思的代码
今天学习了Java的异常,讲到try-catch-finally时,老师演示了一段代码,觉得很有意思,很能反映出其执行的过程,让自己有点绕,特意记录一下. 只要代码执行到try代码内部, 不管有没有异 ...
- [Python][pythonchallenge][TBC]古老的python在线挑战赛,很有意思 (C0-C4)
预计阅读时间:15分钟 背景:搜索资料时候偶然发现的,很有意思,每一关都覆盖了很多知识点 Python版本:3.0 Talking is cheap,show me the code 主页: http ...
- 一套很有意思的C语言测试题目
网络上逛博客,发现了一套很有意思的测试题目: https://kobes.ca/ 大家有兴趣可以做一下,考一些关于C语言使用的细节: 中文翻译参考: https://www.cnblogs.com/l ...
- POJ1135比较有意思的对短路(多米骨牌)
题意: 有一个骨牌游戏,就是推到一个后所有的牌都会被退到的那种游戏,起点是1,有两种骨牌,一种是关键牌,另一种是普通牌,普通牌是连接关键牌用的,给你一些边a b c的意思是关键牌a倒之后c时 ...
- C语言 在VS环境下一个很有意思的报错:stack around the variable was corrupted
今天做一个很简单的oj来温习下c 语言 题目如下 输入 3位正整数 输出 逆置后的正整数 代码如下: #include"stdio.h"int main(){ float h,su ...
随机推荐
- 【eclipse插件开发实战】Eclipse插件开发7——插件发布jar包
Eclipse插件开发7--插件发布jar包 最省事的方式就是直接导出jar包,然后放到eclipse的plugins目录下,重启eclipse即可. step1: 对需要打包的插件工程右击→导出(E ...
- MR 图像分割 相关论文摘要整理
<多分辨率水平集算法的乳腺MR图像分割> 针对乳腺 MR 图像信息量大.灰度不均匀.边界模糊.难分割的特点, 提出一种多分辨率水平集乳腺 MR图像分割算法. 算法的核心是首先利用小波多尺度 ...
- AttributeCollection.Add(String, String) Method
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...
- [Xcode 实际操作]二、视图与手势-(8)UIView视图的纹理填充
目录:[Swift]Xcode实际操作 本文将演示将导入的图片作为纹理,平铺整个屏幕. 往项目中导入一张图片. 点击底部左下角的图标->[Import]->选择需要导入的图片->[O ...
- 快速对接payjs的个人支付接口(收银台模式)
近期在了解个人支付接口,希望能解决我在微信上支付的问题.找了很多平台对比再三,感觉payjs比较专业,其它多是模仿payjs的东西.同时支持支付宝和微信,由于本人支付宝还没开通(需要有一定流量才给开通 ...
- niushop,优秀的国产开源电商系统体验
前几天,小编发布了国产电商开源系统推荐,有个小伙伴后台留言说niushop不错. 先别管这么多,盘他! 我这里下载的是B2C单商户免费版 先把源码下载下来.安装之前先看看niushop的环境要求. P ...
- java数据结构----图
1.图:.在计算机程序设计中,图是最常用的数据结构之一.对于存储一般的数据问题,一般用不到图.但对于某些(特别是一些有趣的问题),图是必不可少的.图是一种与树有些相像的数据结构,从数学意义上来讲,树是 ...
- python3错误之TypeError: 'dict_items' object is not callable
这种错误出现在循环结构中套循环结构,而循环时内部循环为字典,外部循环为该字典调用items方法后取到的值,内部循环调用外部循环中遍历的结果: 解决方案: 将外部循环的items()方法调用改为.key ...
- 【转】String hashCode 方法为什么选择数字31作为乘子
某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主角31.这个 ...
- 关于gc日志中Desired Survivor的疑问和对象晋升老年代的小结
问题背景 (下面的所有内容都是根据书上的Serial/Serial Old收集器下的情况) 在<深入理解JVM>一书中的——3.6.3长期存活的对象将进入老年代的介绍中, 一个例子的jvm ...