使用栈库解决N皇后问题:矩阵作为函数参数的传递咨询
正确传递二维数组的几种方法
首先要明确:你写的bool isValid(int n, bool board[][], int row, int col)是无效的,C语言不允许这种省略所有维度的二维数组参数,必须指定第二维大小或用指针形式。以下是几种适配你现有代码的正确方式:
1. 用变长数组参数(C99及以后支持)
你在main里定义的bool board[n][n]属于变长数组(VLA),函数参数可以直接匹配第二维的大小:
bool isValid(int n, bool board[][n], int row, int col) { // 函数内部正常用board[row][col]访问元素,和你原来的逻辑完全兼容 }
调用时直接传board就行:
isValid(n, board, target_row, target_col);
2. 使用指向一维数组的指针
二维数组名会自动退化为指向其第一行的指针,所以可以用指向一维数组的指针作为参数:
bool isValid(int n, bool (*board)[n], int row, int col) { // 内部访问方式不变,依然用board[row][col] }
调用方式和上面一样,直接传board即可。这种写法和第一种本质等价,只是参数声明的形式不同。
3. 展平为一维数组传递
如果不想依赖变长数组特性(比如兼容C89),可以把二维数组当作一维数组处理,通过计算索引定位元素:
bool isValid(int n, bool *board, int row, int col) { // 把原来的board[row][col]替换成board[row * n + col] // 比如判断列冲突时,遍历行的话就是board[i * n + col] }
调用时传递数组的首地址:
isValid(n, &board[0][0], target_row, target_col); // 或者简化为board[0],效果一样
这种方式需要修改函数内部的元素访问逻辑,但不需要调整数组的定义方式。
关于vector的补充
你之前用vector打乱逻辑,大概率是因为vector<vector<bool>>的内存布局和原生二维数组不一样——原生数组是连续的一块内存,而vector的每行是独立分配的。如果想继续用vector,可以改成vector<bool> board(n*n),然后用和第三种方法一样的索引计算方式访问,这样就能适配你原来的逻辑了。
内容的提问来源于stack exchange,提问作者Julia Evans
相关产品推荐
相关产品推荐

