[英]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.