回溯法 之 八皇后问题
N 皇后问题 : Leetcode 51. N-Queens
迭代写法:
import java.util.ArrayList;
import java.util.List;
public class Solution{
public static void main(String[] args){
int num = 0;
Solution s = new Solution();
s.solveNQueens(4);
}
public List<List<String>> solveNQueens(int n) {
int[] queen = new int[n];
for(int i=0;i<n;i++){
queen[i]=-1;
}
List<List<String>> res = new ArrayList<List<String>>();
int i = 0;
while(i>=0){
while(queen[i]<n-1){
queen[i] ++; // queen at (i,queen[i]) 找下一列
if(i==n-1&&isValid(queen,i,queen[i])){
List<String> elem = new ArrayList<String>();
for(int j=0;j<=n-1;j++){
int val = queen[j];
String s = "";
for(int h=0;h<=n-1;h++){
if(h!=val){
s += ".";
}else{
s += "Q";
}
}
elem.add(s);
}
res.add(elem);
}else if(isValid(queen,i,queen[i])){
i++;
}
}
//fail back
queen[i] = -1;
i--;
}
return res;
}
private boolean isValid(int[] queen, int k, int i) {
// TODO Auto-generated method stub
for(int j=0;j<k;j++){
if(queen[j]!=-1&&(i==queen[j]||k+i==j+queen[j]||k+queen[j]==i+j)){
return false;
}
}
return true;
}
}
递归解法:
import java.util.ArrayList;
import java.util.List;
public class Solution{
public static void main(String[] args){
int num = 0;
Solution s = new Solution();
}
public int num;
public List<List<String>> solveNQueens(int n) {
int[] queen = new int[n];
for(int i=0;i<n;i++){
queen[i]=-1;
}
List<List<String>> res = new ArrayList<List<String>>();
getQueenPuzzle(n,queen,0,res);
return res;
}
private void getQueenPuzzle(int n, int[] queen, int k,List<List<String>> res) {
// TODO Auto-generated method stub
for(int i=0;i<=n-1;i++){
queen[k]=i; // queen at (k,i)
if(k==n-1&&isValid(queen,k,i)){
List<String> elem = new ArrayList<String>();
for(int j=0;j<=n-1;j++){
int val = queen[j];
String s = "";
for(int h=0;h<=n-1;h++){
if(h!=val){
s += ".";
}else{
s += "Q";
}
}
elem.add(s);
}
res.add(elem);
}else if(isValid(queen,k,i)){
getQueenPuzzle(n,queen,k+1,res);
}
// not valid for i, then i++;
}
}
private boolean isValid(int[] queen, int k, int i) {
// TODO Auto-generated method stub
for(int j=0;j<k;j++){
if(queen[j]!=-1&&(i==queen[j]||k+i==j+queen[j]||k+queen[j]==i+j)){
return false;
}
}
return true;
}
}
52. N-Queens II
迭代写法:
import java.util.ArrayList;
import java.util.List;
public class Solution{
public static void main(String[] args){
int num = 0;
Solution s = new Solution();
s.solveNQueens(9);
}
public int num;
public int totalNQueens(int n) {
num = 0;
int[] queen = new int[n];
for(int i=0;i<n;i++){
queen[i]=-1;
}
List<List<String>> res = new ArrayList<List<String>>();
int i = 0;
while(i>=0){
while(queen[i]<n-1){
queen[i] ++; // queen at (i,queen[i]) 找下一列
if(i==n-1&&isValid(queen,i,queen[i])){
num++;
}else if(isValid(queen,i,queen[i])){
i++;
}
}
//fail back
queen[i] = -1;
i--;
}
return num;
}
public List<List<String>> solveNQueens(int n) {
int[] queen = new int[n];
for(int i=0;i<n;i++){
queen[i]=-1;
}
List<List<String>> res = new ArrayList<List<String>>();
int i = 0;
while(i>=0){
while(queen[i]<n-1){
queen[i] ++; // queen at (i,queen[i]) 找下一列
if(i==n-1&&isValid(queen,i,queen[i])){
List<String> elem = new ArrayList<String>();
for(int j=0;j<=n-1;j++){
int val = queen[j];
String s = "";
for(int h=0;h<=n-1;h++){
if(h!=val){
s += ".";
}else{
s += "Q";
}
}
elem.add(s);
}
res.add(elem);
}else if(isValid(queen,i,queen[i])){
i++;
}
}
//fail back
queen[i] = -1;
i--;
}
return res;
}
private boolean isValid(int[] queen, int k, int i) {
// TODO Auto-generated method stub
for(int j=0;j<k;j++){
if(queen[j]!=-1&&(i==queen[j]||k+i==j+queen[j]||k+queen[j]==i+j)){
return false;
}
}
return true;
}
}
递归解法:
import java.util.List;
public class Solution{
public static void main(String[] args){
int num = 0;
Solution s = new Solution();
}
public int num;
public int totalNQueens(int n) {
num = 0;
int[] queen = new int[n];
for(int i=0;i<n;i++){
queen[i]=-1;
}
getQueenPuzzle(n,queen,0);
return num;
}
private void getQueenPuzzle(int n, int[] queen, int k) {
// TODO Auto-generated method stub
for(int i=0;i<=n-1;i++){
queen[k]=i; // queen at (k,i)
if(k==n-1&&isValid(queen,k,i)){
num++;
}else if(isValid(queen,k,i)){
getQueenPuzzle(n,queen,k+1);
}
// not valid for i, then i++;
}
}
private boolean isValid(int[] queen, int k, int i) {
// TODO Auto-generated method stub
for(int j=0;j<k;j++){
if(queen[j]!=-1&&(i==queen[j]||k+i==j+queen[j]||k+queen[j]==i+j)){
return false;
}
}
return true;
}
}