N 皇后 https://leetcode-cn.com/problems/n-queens/
题目描述
题目分析
根据N皇后游戏规则, 任意两个皇后不能出现在同一行, 同一列,和同一斜线上。
所以每一列上最多放置一个皇后, 采用回溯的思想,在每一个位置放置一个皇后,若满足规则则继续放置,直到N个皇后全部放上去再输出结果。
题目实现
#define ND 3
#define MAX 1200
int g_direct[ND][2] = {
{-1,-1},
{-1, 0},
{-1, 1}
};
bool check_dir(int x, int y, int dx, int dy, int n, int** markArr)
{
while(1) {
int nx =x + dx;
int ny =y + dy;
if(nx < 0 || nx >= n || ny < 0 || ny >= n) {
break;
}
if(markArr[nx][ny] == 1) {
return false;
}
x = nx;
y = ny;
}
return true;
}
bool check(int ret, int col, int n, int** markArr)
{
for(int i = 0; i < ND; i++) {
if(check_dir(ret, col,g_direct[i][0], g_direct[i][1], n, markArr) == false) {
return false;
}
}
return true;
}
void dfs(int index, int n, int** markArr, char*** resArr, int* retIndex)
{
if(index >= n) {
char** tmp = (char**)malloc(sizeof(char*) * n);
for (int i = 0; i < n; i++) {
tmp[i] = (char*)malloc(sizeof(char) * (n + 1));
for (int j = 0; j < n; j++) {
if(markArr[i][j] == 1) {
tmp[i][j] = 'Q';
} else {
tmp[i][j] = '.';
}
}
tmp[i][n] = '\0';
}
resArr[*retIndex] = tmp;
(*retIndex) += 1;
return;
}
for(int i = 0; i < n; i++) {
if(check(index, i, n, markArr) == false) {
continue;
}
markArr[index][i] = 1;
dfs(index + 1, n, markArr, resArr, retIndex);
markArr[index][i] = 0;
}
}
char *** solveNQueens(int n, int* returnSize, int** returnColumnSizes)
{
char*** resArr = (char***)malloc(sizeof(char**) * MAX);
int** markArr = (int**)malloc(sizeof(int*) * n);
for(int i = 0; i < n; i++) {
markArr[i] = (int*)malloc(sizeof(int) * (n + 1));
memset(markArr[i], 0, sizeof(int) * (n + 1));
}
* returnSize = 0;
dfs(0, n, markArr, resArr, returnSize);
*returnColumnSizes = malloc(*returnSize * sizeof(int));
for (int i = 0; i < *returnSize; i++) {
(*returnColumnSizes)[i] = n;
}
return resArr;
}
总结思考
待补充