LeetCode52 N-Queens II

来源:互联网 发布:恢复出厂设置数据恢复 编辑:程序博客网 时间:2024/06/14 03:06

详细见:leetcode.com/problems/n-queens-ii


Java Solution: github

package leetcode;public class P052_NQueensII {public static void main(String[] args) {System.out.println(new Solution1().totalNQueens(8));}/* * 2 ms * 80.45% */static class Solution1 {int ans = 0;boolean[] col = null, rup = null, lup = null;    public int totalNQueens(int n) {    if (n < 1)return ans;col = new boolean[n];rup = new boolean[(n << 1) - 1];lup = new boolean[rup.length];search(0);return ans;    }    private void search(int index) {if (index == col.length) {ans ++;return;}for (int i = 0; i != col.length; i ++) {if (! col[i] && ! lup[index + i] && ! rup[col.length - 1 + index - i]) {col[i] = lup[index + i] = rup[col.length - 1 + index - i] = true;search(index + 1);col[i] = lup[index + i] = rup[col.length - 1 + index - i] = false;}}}}}


C Solution: github

/*    url: leetcode.com/problems/n-queens-ii/    AC 6ms 0.00%    AC 3ms 7.14%*/#include <stdio.h>#include <stdlib.h>int valid(char** save, int i, int j, int n) {    int k = 0, ii = 0, jj = 0;    for (k = 0; k < n; k ++) {        if (k != i && save[k][j] == 'Q') return 0;        if (k != j && save[i][k] == 'Q') return 0;    }    ii = i + 1;    jj = j + 1;    while (ii < n && jj < n) {        if (save[ii][jj] != 'Q') {            ii ++;            jj ++;        } else return 0;    }    ii = i - 1;    jj = j - 1;    while (ii > -1 && jj > -1) {        if (save[ii][jj] != 'Q') {            ii --;            jj --;        } else return 0;    }    ii = i + 1;    jj = j - 1;    while (ii < n && jj > -1) {        if (save[ii][jj] != 'Q') {            ii ++;            jj --;        } else return 0;    }    ii = i - 1;    jj = j + 1;    while (ii > -1 && jj < n) {        if (save[ii][jj] != 'Q') {            ii --;            jj ++;        } else return 0;    }    return 1;}void solve(char** save, int row, int n, int* ans) {    int i = 0, j = 0, col = 0;    if (row == n) {        (*ans) ++;        return;    }    for (col = 0; col < n; col ++) {        if (valid(save, row, col, n)) {            save[row][col] = 'Q';            solve(save, row+1, n, ans);            save[row][col] = '.';        }    }}int totalNQueens(int n) {    char** save = (char**) malloc(sizeof(char*) * n);    char* save_row = NULL;    int i = 0, j = 0, ans = 0;    for (i = 0; i < n; i ++) {        save_row = (char*) malloc(sizeof(char) * (n+1));        for (j = 0; j < n; j ++) save_row[j] = '.';        save_row[n] = '\0';        save[i] = save_row;    }    solve(save, 0, n, &ans);    return ans;}void solve2(int row, int n, int* ans, int* col_sign, int* lup_sign, int* rup_sign) {    int col = 0;    if (row == n) {        (*ans) ++;        return;    }    for (col = 0; col < n; col ++) {        if (!col_sign[col] && !lup_sign[row + col] && !rup_sign[col - row + n - 1]) {            col_sign[col] = lup_sign[row + col] = rup_sign[col - row + n - 1] = 1;            solve2(row+1, n, ans, col_sign, lup_sign, rup_sign);            col_sign[col] = lup_sign[row + col] = rup_sign[col - row + n - 1] = 0;        }    }}int totalNQueens2(int n) {    int i = 0, j = 0, ans = 0;    int *col_sign = NULL, *lup_sign = NULL, *rup_sign = NULL;    col_sign = (int*) malloc(sizeof(int) * n);    lup_sign = (int*) malloc(sizeof(int) * (2 * n - 1));    rup_sign = (int*) malloc(sizeof(int) * (2 * n - 1));    for (i = 0; i < n; i ++) col_sign[i] = 0;    for (i = 0; i < 2 * n - 1; i ++) lup_sign[i] = 0;    for (i = 0; i < 2 * n - 1; i ++) rup_sign[i] = 0;    solve2(0, n, &ans, col_sign, lup_sign, rup_sign);    return ans;}int main() {    printf("answer is %d\r\n", totalNQueens2(14));}


Python Solution: github

#coding=utf-8'''    url: leetcode.com/problems/n-queens-ii    @author:     zxwtry    @email:      zxwtry@qq.com    @date:       2017年4月10日    @details:    Solution: 66ms 84.62%'''class Solution(object):    def search(self, a, c, l, r, i, n):        if i == n:            a[0] += 1            return        for j in range(n):            if not c[j] and not l[j+i] and not r[j-i+n-1]:                c[j]=l[j+i]=r[j-i+n-1]=True                self.search(a, c, l, r, i+1, n)                c[j]=l[j+i]=r[j-i+n-1]=False                    def totalNQueens(self, n):        """        :type n: int        :rtype: List[List[str]]        """        a,c,l,r=[0],[False]*n,[False]*(2*n-1),[False]*(2*n-1)        self.search(a, c, l, r, 0, n)        return a[0]    if __name__ == "__main__":    print(Solution().totalNQueens(5))


0 0
原创粉丝点击