nクイーン問題は、n×nチェス盤にnクイーンを配置し、クイーンが互いに攻撃できないようにする方法を研究します。
上の写真は、エイトクイーンの問題の解決策を示しています。
整数nが与えられた場合、すべての異なるnクイーン問題の解を返します。
各ソリューションには、n-クイーン問題の明確なポーン配置計画が含まれています。ここで、「Q」と「。」はそれぞれクイーンと空の位置を表します。
バックトラッキングアルゴリズム
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList();
Set<Integer> lie = new HashSet();
Set<Integer> pie = new HashSet();
Set<Integer> na = new HashSet();
int nums[] = new int[n];
Arrays.fill(nums,-1);
back(n,0,lie,pie,na,nums,res);
return res;
}
public void back(int n,int row,Set<Integer> lie,Set<Integer> na,Set<Integer> pie,int nums[],List<List<String>> res){
if(row==n){
List<String> result = genResult(nums,n);
res.add(result);
return;
}
for(int i=0;i<n;i++){
if(lie.contains(i)){
continue;
}
int pies = row+i;
if(pie.contains(pies)){
continue;
}
int nas = row-i;
if(na.contains(nas)){
continue;
}
nums[row]=i;
lie.add(i);
pie.add(pies);
na.add(nas);
back(n,row+1,lie,na,pie,nums,res);
nums[row]=-1;
lie.remove(i);
pie.remove(pies);
na.remove(nas);
}
}
public List<String> genResult(int[] queens,int n) {
List<String> tempResult = new ArrayList();
for (int i=0;i<queens.length;i++) {
char[] row = new char[n];
Arrays.fill(row,'.');
row[queens[i]] = 'Q';
tempResult.add(new String(row));
}
return tempResult;
}
}