- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是在 TopCoder 竞赛中使用的问题。我了解大部分解决方案,它本质上是在任何时间点跟踪特定节点的最佳解决方案,并且在到达目标节点后可以输出最佳解决方案。但是,该解决方案使用 BFS,我很困惑,因为似乎可以多次访问同一个节点,所以我只是想了解代码是如何工作的。我知道有一个终止条件,但我们如何确保目的地将拥有最佳解决方案,如果 BFS 过程没有“访问”数组,我们如何确保代码实际上终止(即使有终止条件)?我在下面附上了问题陈述和解决方案。
Problem Statement
You are playing a video game that involves escaping from a dangerous area. Within the area there are DEADLY regions you can't enter, HARMFUL regions that take 1 life for every step you make in them, and NORMAL regions that don't affect you in any way. You will start from (0,0) and have to make it to (500,500) using only Up, Left, Right, and Down steps. The map will be given as a String[] deadly listing the DEADLY regions and a String[] harmful listing the HARMFUL regions. The elements in each of these parameters will be formatted as follows:
Input format(quotes for clarity): "X1 Y1 X2 Y2" where (X1,Y1) is one corner of the region and (X2,Y2) is the other corner of the region
The corners of the region are inclusive bounds (i.e. (4,1) and (2,2) include x-values between 4 and 2 inclusive and y-values between 1 and 2 inclusive). All unspecified regions are considered NORMAL. If regions overlap for a particular square, then whichever region is worst takes effect (e.g. DEADLY+HARMFUL = DEADLY, HARMFUL+NORMAL = HARMFUL, HARMFUL+HARMFUL = HARMFUL, DEADLY+NORMAL=DEADLY).
Damage taken at each step occurs based on the destination square and not on the starting square (e.g. if the square (500,500) is HARMFUL you WILL take a point of damage stepping onto it; if the square (0,0) is HARMFUL you WON'T take a point of damage stepping off of it; this works analogously for DEADLY squares).
Return the least amount of life you will have to lose in order to reach the destination. Return -1 if there is no path to the destination. Your character is not allowed to leave the map (i.e. have X or Y less than 0 or greater than 500).
#include <iostream>
#include <limits>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <strstream>
using namespace std;
struct node
{
node(int _x, int _y) {x = _x; y = _y;}
int id() const
{
return y*501+x;
}
int x, y;
};
map <int, int> dist;
bool operator<(const node &n1, const node &n2)
{
if (dist[n1.id()] != dist[n2.id()])
return dist[n1.id()] < dist[n2.id()];
return n1.id() < n2.id();
}
class Escape
{
public:
int grid[501][501];
void clear(int x1, int y1, int x2, int y2, int val)
{
int tx;
if (x2 < x1)
{
tx = x1;
x1 = x2;
x2 = tx;
}
if (y2 < y1)
{
tx = y1;
y1 = y2;
y2 = tx;
}
for (int y = y1; y <= y2; y++)
for (int x = x1; x <= x2; x++)
{
grid[y][x] = val;
}
}
void bfs(int srcx, int srcy)
{
node src(srcx, srcy);
set <node> totry;
dist.clear();
dist[src.id()] = 0;
totry.insert(src);
int x = 0;
while (totry.size())
{
srcx = totry.begin()->x;
srcy = totry.begin()->y;
src = node(srcx, srcy);
/* cout
x++;*/
for (int dstx = srcx-1; dstx <= srcx+1; dstx++)
for (int dsty = srcy-1; dsty <= srcy+1; dsty++)
if (dstx >= 0 && dsty >= 0 && dstx <= 500 && dsty <= 500)
if ( (dstx-srcx)*(dstx-srcx) + (dsty-srcy)*(dsty-srcy) == 1)
{
node dest(dstx, dsty);
int length = grid[dsty][dstx];
if (length < 2)
if (!dist.count(dest.id()) || dist[dest.id()] > dist[src.id()] + length)
{
dist[dest.id()] = dist[src.id()] + length;
totry.insert(dest);
}
}
totry.erase(src);
}
}
int lowest(vector<string> harmful, vector<string> deadly)
{
int i;
clear(0,0,500,500, 0);
for (i = 0; i < harmful.size(); i++)
{
istrstream in(harmful[i].c_str());
int x1, y1, x2, y2;
in >> x1 >> y1 >> x2 >> y2;
clear(x1, y1, x2, y2, 1);
}
for (i = 0; i < deadly.size(); i++)
{
istrstream in(deadly[i].c_str());
int x1, y1, x2, y2;
in >> x1 >> y1 >> x2 >> y2;
clear(x1, y1, x2, y2, 2);
}
bfs(0, 0);
node end = node(500,500);
if (!dist.count(end.id()))
return -1;
else
return dist[end.id()];
}
};
最佳答案
这一行:
if (!dist.count(dest.id()) || dist[dest.id()] > dist[src.id()] + length)
表示“如果位置 dest 不在计算的距离 map 中,或者如果我们找到一条更便宜的新路径,则探索它”。此条件确保 BFS 终止。
关于c++ - TopCoder "Escape"解决困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31028215/
一个简单的GNU m4问题,但是我找不到正确的答案。我想在代码部分的开始/结束处打印一个markdown header : ``` echo Hello ``` 如何创建包含3个反引号的GNU M4宏
我有一个 shell 变量(我们将调用 x),其中包含一个带有 shell 元字符的字符串。例如,我可能有 abc "def's" ghi 设置为 x='abc "def'\''s" ghi'
我有一个 shell 变量(我们将调用 x),其中包含一个带有 shell 元字符的字符串。例如,我可能有 abc "def's" ghi 设置为 x='abc "def'\''s" ghi'
执行以下行时: df = df[df['Directory'].str.contains("C:\Windows\System32\Tasks")] 我收到以下错误: File "/Users/pat
我正在使用 python-social-auth 从我的 Django 应用程序登录社交网络。在我的本地机器上一切正常,但是当我部署到服务器时出现以下错误: oauthlib.oauth1.rfc58
URI.escape 和 CGI.escape 有什么区别,我应该使用哪一个? 最佳答案 斧头和剑有什么区别,我应该使用哪一种?好吧,这取决于您需要做什么。 URI.escape 应该将字符串 (UR
我今天安装了 Zenwalk Linux。我发现 Escape 键没有绑定(bind)到任何东西(至少据我所知),而是 Escape 通常会做什么(关闭程序,打开 vim 命令行等)Shift-Esc
我遇到过一种情况,闭包可能在函数 f1 内部调用(闭包被传递到其中),或者可能会传递给其他函数 f2 >。 所以现在我想知道应该如何定义这个闭包的转义行为。我的意思是我应该放 @escaping 还是
在 js/jQuery 中有没有办法拥有这两种按键组合? ESCape 键 和 SHIFT + ESCape 键 当我实现它时使用: document.onkeydown = function(e){
我正在尝试将字符串中的任何换行符或转义换行符规范化为转义的 unix 换行符。我不明白为什么这不起作用: Pattern EOL = Pattern.compile("(\\\\r)?\\\\n|\r
swift 4.2,Xcode 10.1 在我正在处理的订单处理应用程序中,用户可以搜索已处理或提交的订单。发生这种情况时,它将检查是否有订单缓存,如果没有,它将使用异步 API 请求重新填充该缓存,
我的几个网页名称中包含以下字符&,例如“Shipping & Deliveries”等 我的架构标记注入(inject)了 GTM (JSON-LD),但在 SDTT 中我收到以下错误: Uncate
自版本 1.9.0 起,Twig为 escape 过滤器提供 html_attr 策略(参见 documentation )。 html 策略使用 htmlspecialchars PHP 函数(通过
我有一个像这样的 View Controller : class PublicationListViewController: UIViewController { var publicati
这是我的代码: class Main { init() { let x = Sub(s: foo) } func foo(completion: @escapi
我正在尝试将闭包用于一阶谓词演算,并且我打算定义以下函数: func ASSUM(p: @escaping Pred) -> (Pred) -> Pred { return { q in AN
我有关于 ezSQL_mysql 和 ezSQLcore 的问题,它可能是 PHP 版本不兼容,我分享下面的代码。我应该使用什么版本的 PHP 或者我应该做什么来定制 mysqli? (我的PHP版本
我有以下函数,其中有完成处理程序,但出现此错误: Closure use of non-escaping parameter may allow it to escape 这是我的代码: func m
我正在使用 Swift-VectorBoolean 库,它目前在 Swift 3.2 上,尚未针对 Swift 4.2 进行更新,但应该仍可在 Xcode 10 上运行。在 Xcode 9 上运行它,
我想用这个 ansible 命令在 nrpe.cfg 中插入一个 nrpe 命令 check_tomcat_threads.pl -H localhost -p 30011 -C '"http-bio
我是一名优秀的程序员,十分优秀!