关闭

Hard-题目18:51. N-Queens

74人阅读 评论(0) 收藏 举报
分类:

题目原文:
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space respectively.
题目大意:
给出n,输出N皇后问题的所有解。(别告诉我没做过八皇后,计算机专业的都懂得……)
题目分析:
使用回溯,每放一个皇后判断一下这个位置是否可以被之前的皇后吃掉,如果可以就继续放下去,然后搜索下一行,直到最后一行放上了皇后。
源码:(language:java)

public class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> list = new ArrayList<List<String>>();
        backtrack(n,0,list,new boolean[n][n]);
        return list;
    }
    private void backtrack(int n,int queens,List<List<String>> list,boolean[][] chessboard) {
        if(n==queens) {
            list.add(convert(chessboard,n));
        }
        else {
            for(int j = 0;j<n;j++) { // press a queen at chessboard[queens][j]
                boolean canPress = true;
                for(int s = 0;s<queens;s++) {
                    if(!canPress)
                        break;
                    for(int t = 0;t<n;t++) {
                        if(chessboard[s][t]) {
                            if(t==j || Math.abs(s-queens)==Math.abs(t-j)) {
                                canPress = false;
                                break;
                            }
                        }
                    }
                }
                if(canPress) {
                    chessboard[queens][j] = true;
                    backtrack(n, queens+1, list, chessboard);
                    chessboard[queens][j] = false;
                }
            }
        }
    }
    private List<String> convert(boolean[][] chessboard,int n) {
        List<String> list = new ArrayList<String>();
        for(int i = 0;i<n;i++) {
            String line = "";
            for(int j = 0;j<n;j++) {
                if(chessboard[i][j])
                    line+="Q";
                else
                    line+=".";
            }
            list.add(line);
        }
        return list;
    }
}

成绩:
31ms,beats 2.57%,众数6ms,19.35%
Cmershen的碎碎念:
本题成绩较差,一是没有进行任何剪枝,二是构造了辅助数组chessBoard存储棋盘,每找到一个解就遍历棋盘转换成题目要求的格式。这两点都是开销很大的。
另外在此感叹一下,八皇后是一道非常经典的回溯问题,可以说是当年学习C语言时的第一道坎。四年前当我们的计导课第一次讲到八皇后的问题时,那是一道很多人为之倾倒、乃至为之刷夜的难题,但如今却可以写出优雅的回溯。说明我们编程能力真的已经得到很大的提升了。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:56989次
    • 积分:3213
    • 等级:
    • 排名:第10664名
    • 原创:270篇
    • 转载:53篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论