N皇后问题
题目
n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。
给定一个整数n,返回所有不同的n皇后问题的解决方案。
每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。样例
对于4皇后问题存在两种解决的方案:
挑战
你能否不使用递归完成?
题解
1.递归法
a.在第i行的第j列放置一个皇后,然后判断是否合法,如果合法则递归放置下一行(从第第i+1行的第0列开始),如果不合法则进行回溯。
b.如果当前行是最后一行则保存结果。
class Solution {
/**
* Get all distinct N-Queen solutions
* @param n: The number of queens
* @return: All distinct solutions
* For example, A string '...Q' shows a queen on forth position
*/
ArrayList<ArrayList<String>> solveNQueens(int n) {
ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
int[] row = new int[n];
getQueens(result,row,n,0);
return result;
}
private void getQueens(ArrayList<ArrayList<String>> result,int[] row,int n,int index)
{
if (index == n)
{
ArrayList<String> list = new ArrayList<String>();
for (int i=0;i<row.length;i++)
{
list.add(getQueenStr(n,row[i]));
}
result.add(list);
return;
}
for (int i=0; i<n;i++)
{
if (isValid(row,index,i))
{
row[index] = i;
getQueens(result,row,n,index+1);
row[index] = 0;
}
}
}
private boolean isValid(int[] row, int rowIndex, int columnIndex)
{
for (int i=0;i<rowIndex;i++)
{
if (row[i] == columnIndex || (Math.abs(row[i] - columnIndex) == Math.abs(i - rowIndex)) )
{
return false;
}
}
return true;
}
private String getQueenStr(int n, int pos)
{
StringBuilder sb = new StringBuilder();
for (int i=0;i<n;i++)
{
sb.append(i==pos?"Q":".");
}
return sb.toString();
}
};
2.非递归法
a.先构建一维数组表示棋盘,并初始化为未放置皇后。
b.对第i行的第j列进行尝试,如果可以放置皇后则放置后继续探测下一行(从第第i+1行的第0列开始),如果第i行没有找到可以放置皇后的位置则进行回溯,应回溯至上一行,并将上一行的皇后向后移动一列。
c.如果回溯至第一行则表明所有解都已找到。
d.如果在最后一行找到了皇后位置,则说明找到一个解。
class Solution {
/**
* Get all distinct N-Queen solutions
* @param n: The number of queens
* @return: All distinct solutions
* For example, A string '...Q' shows a queen on forth position
*/
ArrayList<ArrayList<String>> solveNQueens(int n) {
ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
int[] arr = new int[n];
for (int i=0;i<n;i++)
{
arr[i] = Integer.MAX_VALUE;
}
int row = 0;
int column = 0;
while (row < n)
{
while (column < n)
{
if (isValid(arr,row,column))
{
arr[row] = column;
column = 0;
break;
}
else
{
column++;
}
}
if (arr[row] == Integer.MAX_VALUE)
{
if (row == 0)
{
break;
}
else
{
row--;
column = arr[row] + 1;
arr[row] = Integer.MAX_VALUE;
continue;
}
}
if (row == n-1)
{
ArrayList<String> list = new ArrayList<String>();
for (int i=0;i<arr.length;i++)
{
list.add(getQueenStr(n,arr[i]));
}
result.add(list);
column = arr[row] + 1;
arr[row] = Integer.MAX_VALUE;
continue;
}
row++;
}
return result;
}
private boolean isValid(int[] row, int rowIndex, int columnIndex)
{
for (int i=0;i<rowIndex;i++)
{
if (row[i] == columnIndex || (Math.abs(row[i] - columnIndex) == Math.abs(i - rowIndex)) )
{
return false;
}
}
return true;
}
private String getQueenStr(int n, int pos)
{
StringBuilder sb = new StringBuilder();
for (int i=0;i<n;i++)
{
sb.append(i==pos?"Q":".");
}
return sb.toString();
}
};
Last Update 2016.9.27