如何动态创建未知大小的N皇后问题棋盘?
动态创建N皇后棋盘的实现方案
当然可以动态创建未知大小的棋盘,你当前使用的是固定大小的栈上二维数组,要适配从文件读取的N值,有几种实用的实现方式:
方法1:C语言动态分配二维数组
先从文件读取N的数值,再通过malloc分两步分配内存:
#include <stdlib.h> // 假设已从文件读取得到N的值 int N; // 读取文件逻辑... // 第一步:分配存储行指针的数组 int **board = (int **)malloc(N * sizeof(int *)); if (board == NULL) { // 处理内存分配失败 return 1; } // 第二步:为每一行分配列内存并初始化 for (int i = 0; i < N; i++) { board[i] = (int *)malloc(N * sizeof(int)); if (board[i] == NULL) { // 分配失败时回滚已分配的内存 for (int j = 0; j < i; j++) { free(board[j]); } free(board); return 1; } // 将当前行所有元素初始化为0 for (int j = 0; j < N; j++) { board[i][j] = 0; } } // 使用完成后释放内存 for (int i = 0; i < N; i++) { free(board[i]); } free(board);
方法2:一维数组模拟二维棋盘
如果觉得二维分配的代码繁琐,可以用一维数组模拟,通过i * N + j计算索引来访问二维位置:
#include <stdlib.h> int N; // 读取文件逻辑... int *board = (int *)malloc(N * N * sizeof(int)); if (board == NULL) { return 1; } // 初始化所有元素为0 for (int i = 0; i < N * N; i++) { board[i] = 0; } // 访问第i行第j列的元素:board[i * N + j] // 释放内存 free(board);
关键注意事项
- 动态分配的内存必须手动释放,否则会造成内存泄漏
- 每次调用
malloc后都要检查返回值,避免空指针访问 - 如果使用C++开发,直接用
vector<vector<int>> board(N, vector<int>(N, 0))即可,无需手动管理内存
内容的提问来源于stack exchange,提问作者ash
相关产品推荐
相关产品推荐

