n皇后问题

xiaoxiao2021-02-27  204

输入一个正整数 N,则程序输出N皇后问题的全部摆法 #include<iostream> #include <cstdio> #include <vector> #include <cmath> using namespace std; int N; int queenPos[100]; //用来存放算好的皇后位置,最左上角是(0,0) void NQueen(int k); int main( ) { cin>>N; NQueen(0); return 0; } void NQueen (int k){ int i; if(k==N){ for(i=0;i<N;i++) cout<< queenPos[i]+1<<" "; cout<<endl; return ; } for(i=0;i<N;i++){//尝试第K个皇后的位置 行 int j; for(j=0;j<k;j++){//j行表示已经摆好的k个皇后 if(queenPos[j]==i||//这两列相同冲突 列 abs(queenPos[j]-i)==abs(k-j))//对角线 break; } if(j==k) { queenPos[k]=i; NQueen(k+1); } } } package com.interview.recursion; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; /** * Date 02/20/2016 * @author Tushar Roy * * Given nxn board place n queen on this board so that they dont attack each other. One solution is to find * any placement of queens which do not attack each other. Other solution is to find all placements of queen * on the board. * * Time complexity O(n*n) * Space complexity O(n*n) */ public class NQueenProblem { class Position { int row, col; Position(int row, int col) { this.row = row; this.col = col; } } public Position[] solveNQueenOneSolution(int n) { Position[] positions = new Position[n]; boolean hasSolution = solveNQueenOneSolutionUtil(n, 0, positions); if (hasSolution) { return positions; } else { return new Position[0]; } } private boolean solveNQueenOneSolutionUtil(int n, int row, Position[] positions) { if (n == row) { return true; } int col; for (col = 0; col < n; col++) { boolean foundSafe = true; //check if this row and col is not under attack from any previous queen. for (int queen = 0; queen < row; queen++) { if (positions[queen].col == col || positions[queen].row - positions[queen].col == row - col || positions[queen].row + positions[queen].col == row + col) { foundSafe = false; break; } } if (foundSafe) { positions[row] = new Position(row, col); if (solveNQueenOneSolutionUtil(n, row + 1, positions)) { return true; } } } return false; } /* *Solution for https://leetcode.com/problems/n-queens/ */ public List<List<String>> solveNQueens(int n) { List<List<String>> result = new ArrayList<>(); Position[] positions = new Position[n]; solve(0, positions, result, n); return result; } public void solve(int current, Position[] positions, List<List<String>> result, int n) { if (n == current) { StringBuffer buff = new StringBuffer(); List<String> oneResult = new ArrayList<>(); for (Position p : positions) { for (int i = 0; i < n; i++) { if (p.col == i) { buff.append("Q"); } else { buff.append("."); } } oneResult.add(buff.toString()); buff = new StringBuffer(); } result.add(oneResult); return; } for (int i = 0; i < n; i++) { boolean foundSafe = true; for (int j = 0; j < current; j++) { if (positions[j].col == i || positions[j].col - positions[j].row == i - current || positions[j].row + positions[j].col == i + current) { foundSafe = false; break; } } if (foundSafe) { positions[current] = new Position(current, i); solve(current + 1, positions, result, n); } } } public static void main(String args[]) { NQueenProblem s = new NQueenProblem(); Position[] positions = s.solveNQueenOneSolution(6); Arrays.stream(positions).forEach(position -> System.out.println(position.row + " " + position.col)); } }
转载请注明原文地址: https://www.6miu.com/read-11634.html

最新回复(0)