Я пытаюсь создать Sudoku Solver. Я также пытаюсь создать небольшие файлы для каждой задачи, чтобы у меня не было невероятно большого файла для отладки. Игнорируя ввод, мне нужно взять матрицу 9x9 и разбить ее на 9 массивов по 9 значений. Я хотел бы сделать что-то вроде этого:
int main()
{
int Matrix[9][9] = {
[0,2,3,4,5,6,7,8,9],
[1,0,3,4,5,6,7,8,9],
[1,2,0,4,5,6,7,8,9],
[1,2,3,0,5,6,7,8,9],
[1,2,3,4,0,6,7,8,9],
[1,2,3,4,5,0,7,8,9],
[1,2,3,4,5,6,0,8,9],
[1,2,3,4,5,6,7,0,9],
[1,2,3,4,5,6,7,8,0]
};
int Row[9] = SplitMatrix(Matrix);
return 0;
}
с SplitMatrix, выглядящим так:
int Array[9];
int SplitMatrix(int Matrix[][])
{
for (int i=0; i<9; i++)
{
for (int j=0; j<9; j++)
{
Array[j] = Matrix[i][j];
}
return Array;
}
}
Ошибки, с которыми я продолжаю сталкиваться, - это ошибки типа (int vs int *), ошибки присваиваемости, конечно, и просто неспособность отправить/получить правильные данные.
Мои основные проблемы:
(1) Массивы не могут быть назначены, так как же мне получить результат от функции и превратить его в массив, чтобы передать его позже?
(2) Массивы при отправке в функции разлагаются на (псевдо) указатели, так как же мне отправлять и получать данные всего массива между файлами/функциями, а не только адрес первого индекса?
(3) Как только я перехожу к поиску пустого места в каждой строке [он же 0], я в конечном итоге изменяю только локальный массив, особенно когда мне приходится использовать циклы for, так что передается ли он по ссылке или передается по значению ( Мне все равно, какой) как я могу убедиться, что любые изменения, которые я делаю в файле/функции, возвращаются в то место, которое их вызвало?
(4) Есть ли способ использовать цикл для создания 9 массивов с одним вызовом команды/функции? Или мне нужно сделать 9 дискретных массивов и вызывать функцию 9 раз, каждый раз передавая номер строки?
int *SplitMatrix(size_t rows, size_t cols, int (*Matrix)[cols])
{
int *Array = malloc(rows * sizeof(*Array));
if (Array)
for (size_t i=0; i<rows; i++)
{
for (size_t j=0; j<cols; j++)
{
Array[j] = Matrix[i][j];
}
}
return Array;
}
/* .... */
int *Row = SplitMatrix(Matrix);
/* some code */
free(Row);
int
, а не на int
.Чтобы рассматривать массив как копируемую переменную, вы можете обернуть массив в структуру:
#include <stdio.h>
typedef struct {
int items[9];
} Row;
typedef struct {
Row rows[9];
} Matrix;
int main() {
Matrix a = {{
{0,2,3,4,5,6,7,8,9},
{1,0,3,4,5,6,7,8,9},
{1,2,0,4,5,6,7,8,9},
{1,2,3,0,5,6,7,8,9},
{1,2,3,4,0,6,7,8,9},
{1,2,3,4,5,0,7,8,9},
{1,2,3,4,5,6,0,8,9},
{1,2,3,4,5,6,7,0,9},
{1,2,3,4,5,6,7,8,0},
}};
// Structs allow copy assignment
Matrix b = a;
printf("matrix: %d\n", b.rows[1].items[1]);
return 0;
}
C++ допускает более приятный синтаксис, чем b.rows[1].items[1]
. Чтобы изменить Matrix
или Row
в функции, передайте ее как Matrix*
или Row*
. Чтобы ответить на ваш последний вопрос, вы также можете возвращать структуры из функции, чтобы вы могли возвращать Row
s из функции-генератора.
Это определенно не лучший способ сделать это.