N-Queens
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.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
解题思路:
N皇后问题。就是用回溯法找到满足条件的结果记录起来。
先从第一行起,遍历该行的每一列,如果该列的值满足放进皇后的条件,(皇后不能同行同列不能同斜线)就放入皇后,记录当前的行值列值。跳到下一行继续查找。
如果当前行已经到达最后一行,且所有的行都成功的放入了皇后,说明此次遍历成功。记录结果。
如果当前行中所有的列都不能放入皇后,说明此次遍历失败,回溯到上一行,将其作为当前行,遍历改行接下来的列。
这样不断的递归回溯直到查找到所有满足的值。
网上大神们的方法都是用一个一维数组,其中数组的下标表示行,数组的值表示列,这样就能保证所有的皇后肯定是不同行,判断起来也方便很多。
public class Solution {
private List<List<String>> result = new ArrayList<List<String>>();
private String str = "";
public List<List<String>> solveNQueens(int n) {
Integer[] index = new Integer[n];
for(int i = 0;i<n;i++)
str += ".";
Queen(index,0,n);
return result;
}
public void Queen(Integer[] index,int row,int n)
{
for(int i = 1;i<=n;i++)
{
int sub = row-i;
int add = row+i;
int contain = 0;
for(int j = 0;j<row;j++)
{
if(index[j] == i || (j-index[j]) == sub || (j+index[j]) == add)
{
contain = 1;
break;
}
}
if(contain == 1)
continue;
//List<Integer> newindex = new ArrayList<Integer>();
Integer[] newindex = new Integer[n];
for(int j = 0;j<row;j++)
newindex[j] = index[j];
newindex[row] = i;
if(row == n-1)
{
List<String> res = new ArrayList<String>();
for(Integer num:newindex)
{
String newstr = new String(str);
newstr = newstr.substring(0, num-1) + "Q" + newstr.substring(num);
res.add(newstr);
}
result.add(res);
}
else
Queen(newindex,row+1,n);
}
}
}