Heim  >  Artikel  >  Backend-Entwicklung  >  Anwendung der rekursiven C++-Funktion im Backtracking-Algorithmus?

Anwendung der rekursiven C++-Funktion im Backtracking-Algorithmus?

WBOY
WBOYOriginal
2024-04-24 15:00:02731Durchsuche

Rekursive Funktionen lösen Probleme durch Tiefensuche im Entscheidungsbaum im Backtracking-Algorithmus: Die Funktion ruft sich selbst auf und untersucht die Zweige des Entscheidungsbaums. Als Reaktion auf das Problem wird die Funktion die Baumstruktur weiterhin gründlich untersuchen und nach falschen Entscheidungen einen Rückzieher machen. Praktischer Fall: Beim Acht-Damen-Problem platziert die Funktion rekursiv die Königinnen und kehrt zurück, um die falsch platzierten Königinnen rückgängig zu machen, und findet schließlich eine Lösung, die den Anforderungen entspricht.

C++ 递归函数在回溯算法中的应用?

C++-Anwendung einer rekursiven Funktion im Backtracking-Algorithmus

Der Backtracking-Algorithmus ist ein Algorithmus, der auf der Tiefensuche basiert und Probleme löst, indem er den Entscheidungsbaum gründlich untersucht und nach falschen Entscheidungen zurückverfolgt. Rekursive Funktionen spielen eine entscheidende Rolle in Backtracking-Algorithmen und ermöglichen es der Funktion, sich selbst aufzurufen, um die Zweige eines Entscheidungsbaums zu erkunden.

Code:

In C++ können wir rekursive Funktionen verwenden, um Backtracking-Algorithmen zu implementieren, wie zum Beispiel die Lösung des Acht-Damen-Problems:

#include <iostream>
#include <vector>
using namespace std;

// 八皇后问题
bool solveNQueens(vector<vector<int>>& board, int n, int row) {
  if (row == n) {
    return true; // 找到一个解
  }

  for (int col = 0; col < n; col++) {
    if (isSafe(board, row, col)) {
      board[row][col] = 1;  // 放置皇后

      if (solveNQueens(board, n, row + 1)) {
        return true; // 在该分支中找到解
      }

      board[row][col] = 0;  // 回溯:移除皇后
    }
  }

  return false; // 未找到解
}

bool isSafe(vector<vector<int>>& board, int row, int col) {
  for (int i = 0; i < row; i++) {
    if (board[i][col] == 1) {
      return false; // 列冲突
    }
    if (board[i][col - row + i] == 1) {
      return false; // 左对角线冲突
    }
    if (board[i][col + row - i] == 1) {
      return false; // 右对角线冲突
    }
  }
  return true; // 该位置安全
}

int main() {
  int n;
  cout << "请输入棋盘大小:";
  cin >> n;

  vector<vector<int>> board(n, vector<int>(n, 0));

  if (solveNQueens(board, n, 0)) {
    cout << "找到解:\n";
    for (auto& row : board) {
      for (auto& cell : row) {
        cout << cell << " ";
      }
      cout << "\n";
    }
  } else {
    cout << "未找到解\n";
  }

  return 0;
}

Praktischer Fall:

Das Acht-Damen-Problem ist eine bekannte kombinatorische Optimierung Problem: Sie müssen 8 Damen auf einem 8x8-Schachbrett platzieren, damit sie sich nicht gegenseitig angreifen. Dieser Code zeigt, wie man eine rekursive Funktion und einen Backtracking-Algorithmus verwendet, um dieses Problem zu lösen und die Lösung im Schachbrettformat auszugeben.

Das obige ist der detaillierte Inhalt vonAnwendung der rekursiven C++-Funktion im Backtracking-Algorithmus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn