在图中搜索有困难
Having trouble searching through graph
本文关键字:搜索 更新时间:2023-10-16
尝试在Hackerrank上做Count Luck问题。任务是通过节点森林找到一条路径,到达目标*
,并给出目标路径上有超过1条有效相邻路径的节点数量的猜测k
,我必须确定这个猜测是否正确。如果正确,打印"Impressed",否则打印"Oops!"。
玩家从'M'
开始,只有1条完整的路径到达目标。玩家不能通过X
节点。有效路径由.
节点组成,您只能遍历那里。此外,玩家只能上下左右移动。
这里有一个森林的例子,其中4和11是维度,3是猜测:
4 11
.X.X......X
.X*.X.XXX.X
.XX.X.XM...
......XXXX.
3
打印"印象深刻",因为目标路径上有三个节点有超过1个有效的相邻路径。即,在(2,9),(0,5)和(3,3)处,猜对了。
我的方法是先进行深度搜索,然后对每个节点进行分析,并确定它们是否有效。如果有多于1个有效节点(指向目标的节点+指向死角的节点),则递减k
。如果当我们发现目标k
为零时,则打印"Impressed",否则打印"Oops!"。
#include <vector>
#include <stack>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
struct node {
int x, y;
node() = default;
node(int x, int y) : x(x), y(y)
{}
};
string makeGuess(vector<string> const& forest, int n, int m, node player, int k) {
vector<vector<bool>> visited(n, vector<bool>(m));
auto isUnvisitedNode = [&](node v)
{return (0 <= v.x && v.x < n) && (0 <= v.y && v.y < m) && !visited[v.x][v.y];};
std::stack<node> s;
s.push(player);
while (!s.empty()) {
node elem = s.top();
s.pop();
if (!isUnvisitedNode(elem)) continue;
int x = elem.x;
int y = elem.y;
visited[x][y] = true;
if (forest[x][y] == 'X') continue;
if (forest[x][y] == '*') break;
std::queue<node> q;
q.push(node(x, y-1));
q.push(node(x, y+1));
q.push(node(x-1, y));
q.push(node(x+1, y));
int numberOfPaths = 0;
while (!q.empty()) {
node v = q.front();
q.pop();
if (isUnvisitedNode(v)) {
if (forest[v.x][v.y] == '.' || forest[v.x][v.y] == '*') {
numberOfPaths++;
}
}
s.push(v);
}
if (numberOfPaths > 1) k--;
}
if (k == 0)
return "Impressed";
else
return "Oops!";
}
int main() {
int n, m, i, j, k, p, t;
node player;
cin >> t;
for (p = 0; p < t; ++p) {
cin >> n >> m;
vector<string> forest(n);
for (i = 0; i < n; ++i) {
string str; cin >> str;
if ((j = str.find('M')) != string::npos)
player = node(i, j);
forest[i] = move(str);
}
cin >> k;
cout << makeGuess(forest, n, m, player, k) << 'n';
}
}
这段代码对上面的测试用例有效,但对其他几个测试用例失败。比如这个。当它应该打印"印象深刻"时,它打印的是"哎呀!"结果显示k
递减为-2
而不是0
。
41 41
.X.XXXXXXXXXXXXXXXXXXX.X.X.X.X.X.X.X.X.X.
...XXXXXXXXXXXXXXXXXXX...................
.X..X.X.X.X.X.X.X..XXXX*X.X.X.X.X.X.X.XX.
.XXXX.X.X.X.X.X.X.XX.X.X.X.X.X.X.X.X.X.X.
.........................................
.XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
.XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
.XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
.XX.X.X.X.XX.X.XX.X.X.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.
X........................................
X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
.X.XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.XX
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XMX.
.X....................................X..
..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.X...................................X...
.XX.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.XX.XXXX.
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.
.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.
.........................................
294
代码似乎是正确的。我肯定有件小事我忽略了。
我能够通过向节点类添加另一个成员count
来解决这个问题,这是赫敏从M
到*
挥动魔杖的次数。对于所有相邻节点,检查它们是否为有效路径。如果有多个有效路径,则增加所有相邻节点的count
成员并继续搜索。到最后,目标节点将包含答案,我们检查k == lastNode.count
。
std::array<node, 4> arr = {{
node(x, y - 1, last.count),
node(x, y + 1, last.count),
node(x - 1, y, last.count),
node(x + 1, y, last.count)
}};
int count = 0;
for (auto const& v : arr) {
if (isUnvisitedNode(v)) {
if (forest[v.x][v.y] == '.' || forest[v.x][v.y] == '*') {
count++;
}
else {
visited[v.x][v.y] = true;
}
}
}
for (auto& v : arr) {
if (count >= 2) v.count++;
if (isUnvisitedNode(v)) s.push(v);
}
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 在C++中搜索嵌套多映射值
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 为什么二进制搜索在我的测试中不起作用
- 正在尝试重载二进制搜索树分配运算符
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 向量上的线性搜索
- 如何在动态数组上使用搜索函数
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- cmake:添加要搜索头文件的目录
- 使用C++创建特殊的二叉搜索树
- 在C++的字符串中搜索和删除某些字符
- std::unordered_map 搜索算法是如何实现的?
- 使用不变量来确定二分搜索中的边界条件
- 二叉搜索如何比线性搜索更快?
- 按边长度递归搜索图中所有可行路径
- QStackWidget - 按名称搜索
- 在递归二叉搜索树中搜索
- 我的二进制搜索程序只是关闭了