51. N 皇后&52. N 皇后 II

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例 1:
image

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:

输入:n = 1
输出:[["Q"]]

提示:

1 <= n <= 9

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/n-queens

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int isvalid(int *flag,int cur,int j){
    int i;
    for(i=0;i<cur;i++){
        if(flag[i]==j||abs(flag[i]-j)==abs(i-cur)){
            return 0;
        }
    }
    return 1;
}
//cur为当前操作的行
void backtracking(int n,int cur,int *flag,char*** map,int* returnSize, int** returnColumnSizes){
    int i,j;
    if(cur==n){
        map[*returnSize]=(char**)malloc(sizeof(char*)*n);
        for(i=0;i<n;i++){
            map[*returnSize][i]=(char*)malloc(sizeof(char)*(n+1));
            for(j=0;j<n;j++){
                if(flag[i]==j){
                    map[*returnSize][i][j]='Q';
                }else{
                    map[*returnSize][i][j]='.';
                }
            }
            map[*returnSize][i][j]='\0';
        }//填充Q和‘.’
        (*returnColumnSizes)[*returnSize]=n;
        (*returnSize)++;
        return;
    }
   for(j=0;j<n;j++){
        if(isvalid(flag,cur,j)){ //这里判断为1时 执行isvalid判断为不可用,回溯执行backtracking
            flag[cur]=j;
            backtracking(n,cur+1,flag,map,returnSize,returnColumnSizes);
        }
    }
    return;
}

char *** solveNQueens(int n, int* returnSize, int** returnColumnSizes){
    int * flag=(int*)malloc(sizeof(int)*(n+1));
    int i;
    char ***map=(char***)malloc(sizeof(char**)*1000);
    (*returnColumnSizes) = (int*)malloc(sizeof(int)*1000);
    memset(flag,0,sizeof(flag));
    *returnSize=0;
    backtracking(n,0,flag,map,returnSize,returnColumnSizes);
    return map;
}

延伸出的 n皇后 II
n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

int totalNQueens(int n){
    int * flag=(int*)malloc(sizeof(int)*(n+1));
    int number=0;
    memset(flag,0,sizeof(flag));
    int *returnSize=(int*)malloc(sizeof(int));
    *returnSize=0;
    backtracking(n,0,flag,returnSize);
    number=*returnSize;
    return number;

修改最后返回的函数即完成(另外去除填充Q和'.'的部分)

posted @ 2023-07-06 16:04  noobwei  阅读(7)  评论(0编辑  收藏  举报