LeetCode52 N-Queens II

详细见: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值