Там 2d массив (матрица) случайным образом заполнен 1 и 0.
Когда вы нажимаете на ячейку, она меняет свое
состояние, и все остальные ячейки в той же строке,
столбце (вдоль X, Y) также меняются.
Цель состоит в том, чтобы написать функцию unlock(), которая будет
гарантировать, что все ячейки в матрице разблокированы.
Единственное, что я нашел на данный момент: если вы щелкаете ячейки в координатах, которые вместе представляют прямоугольник, вы меняете значения ячеек, не влияя на другие ячейки.
Например
0 -- -----> Д
| 1 0 0 1 0
| 0 1 0 1 0
| 1 0 0 1 1
| 1 1 0 1 1
X
0 0 0 0 0
0 1 0 1 0
0 0 0 0 1
1 1 0 1 1
если последовательно щелкать ячейки по координатам (0,0) (0,3) (3, 0 ) (3, 3) он изменит значения и не повлияет на другие значения на той же оси.
Вопрос заключается в том, чтобы найти разумный способ минимизировать количество кликов и ускорить процесс.< /p>
`
#include iostream
#include vector
#include random
#include chrono
#include time.h
class LockMatrix
{
public:
static const uint64_t cube_ax_min_size = 10;
static const uint64_t cube_ax_max_size = 100;
static const uint64_t cube_lock_frq = 3;
LockMatrix();
bool create (uint64_t x, uint64_t y);
void click (uint64_t x, uint64_t y);
void show ();
bool isLock ();
std::vector read();
private:
std::mt19937_64 rng;
std::vector state;
uint64_t x_size = 0, y_size = 0;
};
void LockMatrix::click(uint64_t x, uint64_t y)
{
state[x][y] = !state[x][y];
for (uint64_t xi = 0; xi < x_size; xi++)
{
if (xi == x)
continue;
state[xi][y] = !state[xi][y];
}
for (uint64_t yi = 0; yi < y_size; yi++)
{
if (yi == y)
continue;
state[x][yi] = !state[x][yi];
}
}
bool LockMatrix::isLock()
{
for (uint64_t x = 0; x < x_size; x++)
{
for (uint64_t y = 0; y < y_size; y++)
{
if (state[x][y])
return true;
}
}
return false;
}
std::vector LockMatrix::read()
{
return state;
}
LockMatrix::LockMatrix()
{
// allocate
rng.seed(time(0));
x_size = 10;//(rng() % (cube_ax_max_size - cube_ax_min_size)) + cube_ax_min_size;
y_size = 10;//(rng() % (cube_ax_max_size - cube_ax_min_size)) + cube_ax_min_size;
state.resize(x_size);
for (uint64_t x = 0; x < x_size; x++)
{
state[x].resize(y_size);
}
// lock
for (uint64_t x = 0; x < x_size; x++)
{
for (uint64_t y = 0; y < y_size; y++)
{
if (rng() % cube_lock_frq)
{
click(x, y);
} }
}
}
void LockMatrix::show()
{
std::cout
Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-1-rule