题解 | #N皇后问题#

N皇后问题

https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Fcompany

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param n int整型 the n
 * @return int整型
 */
#include <string.h>
void func(char** grid, int order, int rowIndex, int colIndex, int* res) {
    if (order - 1 == rowIndex) {//成功进入最后一行
        *res = *res + 1;
        return;
    }
    char matrix[order][order];//新建数组,递归不改变初始数组
    memcpy(matrix, grid, order * order);
    int i, j;
    for (j = 0; j < order; ++j)//同行清零
        matrix[rowIndex][j] = 0;
    for (i = rowIndex + 1; i < order; ++i)//同列清零
        matrix[i][colIndex] = 0;
    for (i = rowIndex + 1, j = colIndex + 1; i < order && j < order; ++i, ++j)//主对角线清零
        matrix[i][j] = 0;
    for (i = rowIndex + 1, j = colIndex - 1; i < order && j >= 0; ++i, --j)//副对角线清零
        matrix[i][j] = 0;
    for (i = rowIndex + 1, j = 0; i < order && j < order; ++j) {//找到下一行的位置
        if (matrix[i][j])
            func(matrix, order, i, j, res);
    }
}

int Nqueen(int n ) {
    // write code here
    int res = 0;
    char matrix[n][n];
    memset(matrix, 1, n * n);//初始赋值1
    for (int i = 0; i < n / 2; ++i) {//对称性
        func(matrix, n, 0, i, &res);
    }
    res *= 2;
    if (n % 2) func(matrix, n, 0, n / 2, &res);//奇数阶数单独算中间的位置
    return res;
}

全部评论

相关推荐

10-31 22:23
门头沟学院 Java
天然不是卷王:太好了 佬的金九银十结束,等offer吐出来,我的金11银12就要开始了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务