如何制作一个布尔数组来保存二维数组中大于 0 的数字的位置?

问题描述

我正在创建一个解决数独谜题的算法,但其中一个要求是我必须创建一个 bool 数组来锁定任何指定数字的初始位置(在这种情况下,任何不为 0 的数字) ) 这样当算法运行时,它不会改变“锁定”的数字

基本上,下面的数组就是“拼图”本身,我需要创建一个 2D bool 数组来保存最初提供的数字的位置,以便算法在以后运行时无法更改它们

这是拼图本身和数据结构的代码

#define N 9
typedef struct Coordinates
{

    int row;
    int column;

};

int sudokuArray[N][N] = {
            {0,6,4,0},{7,3,{0,9,1,8,5,3},5},2,{9,0}
    };

解决方法

你可以做一些内存效率较低但速度更快的事情:

不是存储值数组,而是存储值结构数组和告诉给定位置是否可变的布尔值。

#include <cstdint>
#include <array>

// Prefer constexpr to macros
constexpr uint32_t size = 9;

struct sudoku_field
{
    uint8_t value;
    bool is_mutable;
};

std::array<std::array<sudoku_field,size>,size> sudoku_board
{
    { {0,0},{0,{6,1},{4,0} },{ {7,{3,...
}

当您需要测试字段是否应该是可变的时,这种方法将提供恒定的查找时间。


您的方法需要一个位置向量,其中该向量中的每个条目都是不可变的。

#include <vector>
#include <algorithm>

struct coordinates
{
    int8_t row;
    int8_t column;
};

std::vector<coordinates> immutable_positions;

// And this would be a test funciton
bool is_immutable(int8_t row,int8_t column)
{
    auto res = std::find(std::begin(immutable_positions),std::end(immutable_positions),coordinates{row,column});
    return res == std::end(immutable_positions);
}
,

您可以执行与 sudoko 拼图完全相同的操作。
另一种选择是以编程方式查找非零数字。

    for(int i = 0; i < ROW_SIZE; ++i)
    {
        for(int j = 0; j < ROW_SIZE; ++j)
        {
            boolArray[i][j] = (sudokuArray[i][j] > 0);
        }
    }