簡體   English   中英

用矩陣替換 function 中的 integer 值定義的常量

[英]Replacing defined constant by an integer value in function with matrices

我想通過從標准輸入中獲取棋盤的大小(N)來修改 N-Queens 回溯算法,而不是將 N 定義為常數。 但是,我無法匹配函數的類型。 我應該定義某種全局最大常數然后使用 n 嗎?

這是代碼:

#include <iostream>
using namespace std;

bool safe(int N, char mat[][N], int v, int k)
{
    int i, j; 
    for (i = 0; i < v; i++) 
        if (mat[i][k] == 'Q')
            return false;
    for (i = v, j = k; i >= 0 && j >= 0; i--, j--) 
        if (mat[i][j] == 'Q')
            return false;

    for (i = v, j = k; i >= 0 && j < N; i--, j++) 
        if (mat[i][j] == 'Q')
            return false;

    return true;
}

void backtrack(int N, char mat[][N], int v)
{
    if (v == N)
    {
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
                cout << mat[i][j] << " ";
            cout << endl;
        }
        cout << endl;

        return;
    }

    for (int i = 0; i < N; i++)
    {
        if (safe(N, mat, v, i))
        {
            mat[v][i] = 'Q';
            backtrack(N, mat, v + 1);
            mat[v][i] = '-';
        }
    }
}

int main()
{
    int N; 
    cin >> N;
    char mat[N][N];
    memset(mat, '-', sizeof mat);

    backtrack(N,mat, 0);

    return 0;
}

char mat[N][N]; 是一個可變長度數組 (VLA),它是您應該避免使用的一些 c++ 編譯器的非標准擴展。 如果您需要運行時分配 memory,請考慮使用std::vector

int N{};
std::cin >> N;
std::vector<std::vector<char>> mat(N, std::vector<char>(N, '-'));

會做你想做的。 然后,您可以使用以下命令將其傳遞給任何 function:

void foo(const std::vector<std::vector<char>>& mat); // for read-only
void foo(std::vector<std::vector<char>>& mat); // for read-write

注意:這可能效率較低,具體取決於 memory 的分配方式。 如果您需要將 memory 排列在一起,請使用一維向量並訪問 function 為您獲取索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM