📜  2d 矢量后推 - C++ (1)

📅  最后修改于: 2023-12-03 14:59:04.640000             🧑  作者: Mango

2D Vector Backtracking - C++

Introduction

In computer programming, backtracking is a technique for solving problems recursively by trying to build a solution incrementally, one piece at a time, removing from it anything that does not work. As the name suggests, 2D Vector backtracking refers to using this technique on 2D arrays or vectors.

Algorithm
  1. First, create a 2D vector to represent the board or grid.
  2. Start at a certain point on the board, such as the top left corner.
  3. Try a move in each direction (up, down, left, and right) from the current position.
  4. If the move is valid (i.e. it doesn't take you off the board and doesn't land you on a previously visited spot), mark the new position as visited and move there.
  5. Repeat steps 3 and 4 until you either reach your goal or can't make any more moves.
  6. If you can't make any more moves, backtrack to the previous position and try the next direction.
  7. Repeat steps 3-6 until you find a valid solution or exhaust all possible paths.
Code Example

Here is an example implementation of the 2D vector backtracking algorithm in C++:

#include <iostream>
#include <vector>

using namespace std;

// Function to check if a move is valid
bool is_valid_move(vector<vector<int>>& board, int row, int col) {
    int n = board.size();
    // Check if the move is within the board
    if (row < 0 || row >= n || col < 0 || col >= n) {
        return false;
    }
    // Check if the spot has already been visited
    if (board[row][col] != 0) {
        return false;
    }
    // Otherwise, it's a valid move
    return true;
}

// Function to perform backtracking
bool perform_backtracking(vector<vector<int>>& board, int row, int col) {
    int n = board.size();
    // Base case: we've reached the goal
    if (row == n - 1 && col == n - 1) {
        return true;
    }
    // Try moving in each direction
    // Up
    if (is_valid_move(board, row - 1, col)) {
        board[row - 1][col] = board[row][col] + 1;
        if (perform_backtracking(board, row - 1, col)) {
            return true;
        }
        board[row - 1][col] = 0;
    }
    // Down
    if (is_valid_move(board, row + 1, col)) {
        board[row + 1][col] = board[row][col] + 1;
        if (perform_backtracking(board, row + 1, col)) {
            return true;
        }
        board[row + 1][col] = 0;
    }
    // Left
    if (is_valid_move(board, row, col - 1)) {
        board[row][col - 1] = board[row][col] + 1;
        if (perform_backtracking(board, row, col - 1)) {
            return true;
        }
        board[row][col - 1] = 0;
    }
    // Right
    if (is_valid_move(board, row, col + 1)) {
        board[row][col + 1] = board[row][col] + 1;
        if (perform_backtracking(board, row, col + 1)) {
            return true;
        }
        board[row][col + 1] = 0;
    }
    // If no valid moves, backtrack
    return false;
}

// Function to solve the puzzle
void solve_puzzle(vector<vector<int>>& board) {
    board[0][0] = 1;
    if (perform_backtracking(board, 0, 0)) {
        // Print the solution
        int n = board.size();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cout << board[i][j] << " ";
            }
            cout << endl;
        }
    } else {
        cout << "No solution found." << endl;
    }
}

// Main function
int main() {
    vector<vector<int>> board = {{0, 0, 0, 0},
                                 {0, 0, 0, 0},
                                 {0, 0, 0, 0},
                                 {0, 0, 0, 0}};
    solve_puzzle(board);
    return 0;
}

The above code generates a 4x4 grid and solves it using the 2D vector backtracking algorithm. The is_valid_move function checks if the move is within the board and hasn't already been visited, and the perform_backtracking function recursively tries each move until it reaches the goal or exhausts all possible paths. The solve_puzzle function initializes the starting position and calls perform_backtracking to solve the puzzle.

Conclusion

The 2D Vector backtracking algorithm is a powerful technique that can be used to solve a variety of problems involving grids or boards. By using recursion and backtracking, this algorithm can efficiently search through all possible paths until it finds a valid solution. This makes it a valuable tool for programmers working on problems in fields such as computer graphics, artificial intelligence, and game development.