我正在尝试构建一个数独求解器。我还试图为每个任务创建小文件,这样我就没有一个不可能的大文件来调试。忽略输入,我需要采用 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) 一旦我去解决每一行中的空白空间 [aka the 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
而不是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]
更好的语法。