n皇后问题

作者: littlersmall | 来源:发表于2016-02-02 13:34 被阅读364次

今天做leetcode遇到的。
感慨颇多。
第一次做这个题,好像是大一,在一本数据结构上看到的,8皇后问题。书的本意是通过这个题引出回朔的概念,可我用了个8重循环,解决后沾沾自喜,也没继续往下看。
第二次遇到好像是大二做usaco的时候了,磕磕绊绊用了各种方式加参考别人代码总算过去,当时感觉这种回朔好难写。
然后,就是现在了。
好多好多年过去了, 我早已忘记了当时在各种OJ刷题的种种。只是依然记得,某一天深夜的晚上,提交成功后正在发呆的时候,qq音乐切换到了一首《kiss the rain》。那温柔的,恬静的,细腻的,忧伤的旋律在耳边缓缓流淌,好像在一片如镜般的湖面上荡起的圈圈涟漪.....
也是从那一刻起,我喜欢上了写程序。

贴一下现在的代码吧,多少还是有点进步的:

import java.util.ArrayList;
import java.util.List;
public class NQueens1 {
    private String[] queensToString(int[] queens) {
        String[] strArray = new String[queens.length];
        int index = 0;
        
        //System.out.println("start");
        
        for (int num : queens) {
            char[] row = new char[queens.length];
        
            for (int i = 0; i < row.length; i++ ) {
                if (i == num) {
                row[i] = 'Q';
                } else {
                    row[i] = '.';
                }
            }
            
            strArray[index++] = new String(row);
            //System.out.println(strArray[index-1]);
        }
        
        //System.out.println("end");
        
        return strArray;
    }
    
    private void setRow(int curI, int curJ, int[][] flag) {
        for (int row = 0; row < flag.length; row++) {
            flag[row][curJ]++;
        }
        
        for (int i = curI+1, j = curJ+1; i<flag.length && j<flag.length; i++, j++) {
            flag[i][j]++;
        }
        
        for (int i = curI-1, j = curJ-1; i>=0 && j>=0; i--, j--) {
            flag[i][j]++;
        }
        
        for (int i = curI+1, j = curJ-1; i<flag.length && j>=0; i++, j--) {
            flag[i][j]++;
        }
        
        for (int i = curI-1, j = curJ+1; i>=0 && j<flag.length; i--, j++) {
            flag[i][j]++;
        }
    }
    
    private void unSetRow(int curI, int curJ, int[][] flag) {
        for (int row = 0; row < flag.length; row++) {
            flag[row][curJ]--;
        }
        
        for (int i = curI+1, j = curJ+1; i<flag.length && j<flag.length; i++, j++) {
            flag[i][j]--;
        }
        
        for (int i = curI-1, j = curJ-1; i>=0 && j>=0; i--, j--) {
            flag[i][j]--;
        }
        
        for (int i = curI+1, j = curJ-1; i<flag.length && j>=0; i++, j--) {
            flag[i][j]--;
        }
        
        for (int i = curI-1, j = curJ+1; i>=0 && j<flag.length; i--, j++) {
            flag[i][j]--;
        }
    }
    
    public List<String[]> solveNQueens(int n) {
        int[] queens = new int[n];
        int[][] flag = new int[n][n];
        //int sum = 0;
        List<String[]> resList = new ArrayList<String[]>();
        
        for (int i = 0; i < n; i++) {
            queens[i] = -1;
        }
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                flag[i][j] = 0;
            }
        }
        
        int index = 0;
        
        while (true) {
            int preQueen = queens[index];
            
            if (preQueen >= 0) {
                unSetRow(index, preQueen, flag);
            }
            
            int newQueen = preQueen+1;
            
            for (; newQueen < n; newQueen++) {
                if (flag[index][newQueen] == 0) {
                    queens[index] = newQueen;
                    setRow(index, newQueen, flag);
                    break;
                }
            }
            
            if (index == 0 
                    && newQueen == n) {
                break;
            } else if (newQueen == n) {
                queens[index] = -1;
                index--;
            } else {
                index++;
                
                if (index == n) {
                    index--;
                    //sum++;
                    resList.add(queensToString(queens));
                }
            }
        }
        
        //System.out.println(sum);
        
        return resList;
    }
    
    public static void main(String[] args) {
        NQueens1 test = new NQueens1();
        
        test.solveNQueens(4);
    }
}

(原文时间2015-4-9 )

相关文章

  • 回溯之N皇后

    N皇后问题:在 n x n 的棋盘上放置 N 个皇后,使其不能相互攻击。 1. 问题分析 皇后相互攻击是指:在皇后...

  • 风云的ARTS打卡(第四周)

    第4周 Algorithm: N皇后问题 n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间...

  • lintcode-N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。 给定一个整数n,返回所有不同的n皇后问题的...

  • lintcode N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。给定一个整数n,返回所有不同的n皇后问题的解...

  • LeetCode 52. N皇后 II(N-Queens II)

    52. N皇后 II N皇后 IIn 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之...

  • N皇后问题

    N皇后问题

  • 第16章 抽象深度优先搜索

    1、2n皇后问题 算法分析 与n皇后问题类似,如下是n皇后问题的分析,时间复杂度 按行继续比遍历,其中col[x]...

  • LeetCode 51. N皇后(N-Queens)

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

  • 52. N皇后 II

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

  • LeetCode 51. N-Queens

    Leetcode : N-QueensDiffculty:Hard N皇后问题,对八皇后问题的扩展,典型的回溯法算...

网友评论

    本文标题:n皇后问题

    本文链接:https://www.haomeiwen.com/subject/kaoskttx.html