将回溯划分为并行进程

发布于 2025-01-10 13:14:55 字数 68 浏览 0 评论 0原文

我正在尝试使用 c 中的回溯过程来解决数独 25*25 问题。有没有办法将回溯分成多个并行进程,以便我可以将它们用作线程?

I am trying to solve sudoku 25*25 using the backtracking process in c. Is there any way to divide backtracking into multiple parallel processes so that I could use them as threads?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏末 2025-01-17 13:14:55

回溯意味着深度优先搜索。

DFS 将采用以下形式:

  1. 创建状态堆栈。
  2. 将初始状态压入堆栈。
  3. 虽然堆栈不为空,
    1. 从堆栈中弹出一个状态。
    2. 如果国家满足搜索要求,
      1. 返回状态。
    3. 对于每个可能的派生状态,
      1. 将派生状态压入堆栈。
  4. 返回失败。

(递归通常用于提供堆栈,但这不是必需的。)

在数独求解器的上下文中,

  1. 创建状态堆栈。
  2. 将初始状态压入堆栈。
  3. 虽然堆栈不为空,
    1. 从堆栈中弹出一个状态。
    2. 如果国家满足搜索要求,
      1. 返回状态。
    3. 找到一个空的方块。
    4. 对于正方形中的每个可能值,
      1. 克隆当前状态。
      2. 设置处于克隆状态的方块的值。
      3. 将克隆的状态压入堆栈。
  4. 无效数独

不过,我会使用广度优先搜索。它与上面的相同,只是使用队列而不是堆栈。

我们可以轻松地将其转换为基于工人的模型。只需使用线程安全队列和一堆执行循环的线程即可。

Backtracking implies a depth-first search.

A DFS will take on the following form:

  1. Create a stack of states.
  2. Push the initial state onto the stack.
  3. While the stack isn't empty,
    1. Pop a state from the stack.
    2. If the search is satisfied by the state,
      1. Return the state.
    3. For each possible derived state,
      1. Push the derived state onto the stack.
  4. Return a failure.

(Recursion is often used to provide the stack, but that's no requirement.)

In the context of a Sudoku solver,

  1. Create a stack of states.
  2. Push the initial state onto the stack.
  3. While the stack isn't empty,
    1. Pop a state from the stack.
    2. If the search is satisfied by the state,
      1. Return the state.
    3. Find an empty square.
    4. For each possible value in the square,
      1. Clone the current state.
      2. Set the value for the square in the cloned state.
      3. Push the cloned state onto the stack.
  4. Invalid Sudoku

I would use a breadth-first search, though. It's identical to the above, except a queue is used instead of a stack.

We can easily convert that to a worker-based model. Just use a thread-safe queue, and a bunch of threads executing the loop.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文