【问题标题】:Replacing defined constant by an integer value in function with matrices用矩阵用函数中的整数值替换定义的常量
【发布时间】:2020-10-03 21:07:37
【问题描述】:

我想修改 N-Queens 回溯算法,方法是从标准输入中获取棋盘的大小 (N),而不是将 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;
}

【问题讨论】:

    标签: c++ algorithm matrix


    【解决方案1】:

    char mat[N][N]; 是一个可变长度数组 (VLA),它是一些你应该避免使用的 c++ 编译器的非标准扩展。如果您需要运行时分配的内存,请考虑使用std::vector

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

    会做你想做的事。然后,您可以使用以下方法将其传递给任何函数:

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

    注意:这可能会降低效率,具体取决于内存的分配方式。如果您需要将内存排列在一起,请使用一维向量和访问函数为您获取索引。

    【讨论】:

      猜你喜欢
      • 2015-01-28
      • 2017-08-13
      • 2016-04-24
      • 2014-05-05
      • 1970-01-01
      • 2015-08-27
      • 2014-11-29
      • 2015-11-24
      相关资源
      最近更新 更多