小编tom*_*pek的帖子

将弓箭手放在墙上

我有一个矩阵(0和1),代表城墙和周围环境.

我的任务是将n弓箭手以某种方式放在墙上,以便尽可能多地覆盖环境.有两个规则:

1:每个射手的射程都是1 - 这意味着他只能射击相邻的瓷砖(每个瓷砖有8个邻居),这些不是墙壁(这支军队禁止友军火力!).

2:如果发生这种情况,那么多个弓箭手可以在同一个瓦片上射击,那个瓦片只计为一个.

我正在努力为此找到有效的解决方案 - 部分是因为我不知道,如果在多项式时间内存在任何问题.有没有?

我猜第一步是使用BFS算法对矩阵上的每个瓦片进行评级,但我不知道如何用第二个规则有效地解决它.蛮力解决方案非常简单 - 对每个位置进行评级,然后尝试所有这些,这将是非常非常无效的 - 我认为O(|可能的位置| ^ n),这是不好的.

简单的例子:

灰色的瓷砖代表墙壁.瓷砖内的数字表示放置在该瓷砖上的射手的覆盖范围.可以肯定的是,我添加了橙色,代表了位于瓷砖b2上的弓箭手的覆盖范围.最后的信息 - 正确的解决方案是b2和b6,覆盖率为14.它不能是b2和b4,因为它们只覆盖了11个区块.

样本测试用例

algorithm

9
推荐指数
1
解决办法
132
查看次数

使用OpenMP并行化此递归的最佳方法

我有以下递归函数(注意:它删除了所有不重要的细节)

int recursion(...) {

  int minimum = INFINITY;
  for(int i=0; i<C; i++) {
      int foo = recursion(...);

      if (foo < minimum) {
          minimum = foo;
      }
  }

  return minimum;
}
Run Code Online (Sandbox Code Playgroud)

注意2:这是有限的,但在此简化示例中不是,所以请忽略它。这个问题的重点是如何正确地解决这个问题。

我当时正在考虑使用任务,但是我不确定如何正确使用它-如何使内部循环并行化。

编辑1:递归树不平衡。它与动态编程方法一起使用,因此随着时间的流逝,很多值会在以前的过程中重复使用。这让我很担心,我认为这将是一个很大的瓶颈。

C在20左右。

最好的指标是最快的:)

它将在2x Xeon上运行,因此有足够的硬件电源可用。

c c++ openmp

6
推荐指数
1
解决办法
3863
查看次数

同时单击包含选项和命令的组

我正在尝试创建具有以下行为的应用程序:

myapp- 将启动应用程序并执行操作 A

myapp "some argument"- 会做事情 B。事情 B 受到参数“某些参数”的影响。

myapp command- 将启动具有功能 C 的“命令”(由装饰器表示@cli.command)。这将受到 click 必须提供的所有内容的影响,例如@click.option

请注意,在我的应用程序中会有更多像 C 这样的命令。


我尝试使用以下代码来实现这一点:

import click

class GroupWithOption(click.Group):
    def list_commands(self, ctx):
        return ['command']

    def get_command(self, ctx, cmd_name):
        if cmd_name == 'command':
            return command
        else:
            return do_b


@click.group(cls=GroupWithOption, invoke_without_command=True)
def main():
    print("Does A")

@main.command()
def command():
    print("Does C")

@main.command()
def do_b():
    print("Does B")


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

结果好坏参半。其一,我可以非常轻松地调用 3 种不同的行为(或更多),但我无法弄清楚如何将参数传递给 B 命令。我不喜欢这个解决方案。 …

python command-line-interface python-3.x python-click

5
推荐指数
1
解决办法
5732
查看次数

使用Qt :: X11BypassWindowManagerHint标志时,窗口无法获得焦点

我需要创建窗口,它始终保持在顶部,没有边框和控件.所以我这样做了:

MainWindow window;
window.show();
Run Code Online (Sandbox Code Playgroud)

MainWindow类看起来像这样:

MainWindow::MainWindow(QWidget *parent) : QWidget(parent, 
Qt::Window | Qt::WindowStaysOnTopHint 
| Qt::X11BypassWindowManagerHint | Qt::FramelessWindowHint) {

}

void MainWindow::keyPressEvent(QKeyEvent *event){
    if(event->key() == Qt::Key_Escape){
        QApplication::exit();
    } else
        QWidget::keyPressEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

哪个有效,但不完美.程序启动后,窗口没有焦点,所以你必须先点击它.如果我删除Qt::X11BypassWindowManagerHint,窗口获得焦点,但不会显示在所有工作区(桌面).

问题1:什么是Qt::X11BypassWindowManagerHint真正做到?

问题2:我如何使这个工作?

c++ qt

4
推荐指数
1
解决办法
777
查看次数