博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TC1570 DesertWind
阅读量:4568 次
发布时间:2019-06-08

本文共 1811 字,大约阅读时间需要 6 分钟。

给定一个 \(n\times m\) 的地图, '@' 表示你所在的位置, '-' 表示这是沙地, '*' 表示绿洲, 'X' 表示不可到达。你每天可以向周围八格移动,同时每天风也有八个方向,若你恰好逆风行走,则一段路程需要走三天,否则只用走一天。你可以预知今后每天的风向,求所有今后风向情况中,你至多会走多少天才能到达任何一个绿洲,无解返回 \(-1\)

\(n,\ m\leq50\)

dp,最短路


\(f_{i,\ j}\) 表示从 \((i,\ j)\) 走到任意一个绿洲所需的最小天数。该状态可以从八个方向转移而来,最坏情况下风向可能恰好使得当前转移的最优解逆风行走,此时可以记录当前转移的次优解,所以 \(f_{i,\ j}=\min(s0+3,\ s1+1)\) ,其中 \(s0\) 为最优解, \(s1\) 为次优解。

可以发现这样转移的 dp 有环,可以考虑用最短路求答案。此题可以像 dijkstra 一样松弛 \(n\times m\) 次,每次松弛更新所有 \(f_{i,\ j}\) 的答案。

时间复杂度 \(O(n^2m^2)\)

代码

#include 
using namespace std;const int maxn = 55;const int dx[] = {-1, 0, 1, 0, -1, 1, 1, -1}, dy[] = {0, 1, 0, -1, 1, 1, -1, -1};char a[maxn][maxn];int n, m, f[maxn][maxn];struct DesertWind { int daysNeeded(vector
field) { int Sx, Sy; n = field.size(); m = field[0].size(); memset(f, 0x3f, sizeof f); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { a[i][j] = field[i][j]; if (a[i][j] == '*') f[i][j] = 0; if (a[i][j] == '@') Sx = i, Sy = j; } } for (int T = 0; T < n * m; T++) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] == 'X') continue; int v1 = 2e9, v2 = 2e9; for (int k = 0; k < 8; k++) { int x = i + dx[k], y = j + dy[k]; if (x < 0 || y < 0 || x >= n || y >= m) continue; if (v1 > f[x][y]) { v2 = v1, v1 = f[x][y]; } else if (v2 > f[x][y]) { v2 = f[x][y]; } } f[i][j] = min(f[i][j], min(v1 + 3, v2 + 1)); } } } return f[Sx][Sy] > 1e9 ? -1 : f[Sx][Sy]; }} Winnie_the_Pooh;int main() { printf("%d\n", Winnie_the_Pooh.daysNeeded({"*--X-----", "--XX--@--", "*-X------"})); return 0;}

转载于:https://www.cnblogs.com/Juanzhang/p/11319621.html

你可能感兴趣的文章
猫眼电影爬取(一):requests+正则,并将数据存储到mysql数据库
查看>>
android的ArrayMap类
查看>>
2011年5款备受关注的开源 NoSQL 数据库
查看>>
2-4-1 元组
查看>>
476. Number Complement(补数)
查看>>
生成函数
查看>>
HTMl5的存储方式sessionStorage和localStorage详解
查看>>
BZOJ 4516: [Sdoi2016]生成魔咒——后缀数组、并查集
查看>>
《JAVA程序设计》实训第一天——《猜猜看》游戏
查看>>
普通用户 crontab 任务不运行
查看>>
第三次冲刺(三)
查看>>
android实现静默安装demo
查看>>
数据缓存方案
查看>>
HDU 1086:You can Solve a Geometry Problem too
查看>>
HIPO图
查看>>
工作日志2014-06-30
查看>>
稀疏矩阵
查看>>
OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)
查看>>
移动端事件点透问题
查看>>
P1896 [SCOI2005]互不侵犯
查看>>