给定nx棋盘的n,找到皇后在棋盘上的正确位置。
先前的方法: N Queen
算法 :
Place(k, i)
// Returns true if a queen can be placed
// in kth row and ith column. Otherwise it
// returns false. X[] is a global array
// whose first (k-1) values have been set.
// Abs( ) returns absolute value of r
{
for j := 1 to k-1 do
// Two in the same column
// or in the same diagonal
if ((x[j] == i) or
(abs(x[j] – i) = Abs(j – k)))
then return false;
return true;
}
算法nQueens(k,n):
// Using backtracking, this procedure prints all
// possible placements of n queens on an n×n
// chessboard so that they are nonattacking.
{
for i:= 1 to n do
{
if Place(k, i) then
{
x[k] = i;
if (k == n)
write (x[1:n]);
else
NQueens(k+1, n);
}
}
}
C++
// CPP code to for n Queen placement
#include
#define breakLine cout << "\n---------------------------------\n";
#define MAX 10
using namespace std;
int arr[MAX], no;
void nQueens(int k, int n);
bool canPlace(int k, int i);
void display(int n);
// Function to check queens placement
void nQueens(int k, int n){
for (int i = 1;i <= n;i++){
if (canPlace(k, i)){
arr[k] = i;
if (k == n)
display(n);
else
nQueens(k + 1, n);
}
}
}
// Helper Function to check if queen can be placed
bool canPlace(int k, int i){
for (int j = 1;j <= k - 1;j++){
if (arr[j] == i ||
(abs(arr[j] - i) == abs(j - k)))
return false;
}
return true;
}
// Function to display placed queen
void display(int n){
breakLine
cout << "Arrangement No. " << ++no;
breakLine
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (arr[i] != j)
cout << "\t_";
else
cout << "\tQ";
}
cout << endl;
}
breakLine
}
// Driver Code
int main(){
int n = 4;
nQueens(1, n);
return 0;
}
Java
// Java code to for n Queen placement
class GfG
{
static void breakLine()
{
System.out.print("\n---------------------------------\n");
}
static int MAX = 10;
static int arr[] = new int[MAX], no;
// Function to check queens placement
static void nQueens(int k, int n)
{
for (int i = 1; i <= n; i++)
{
if (canPlace(k, i))
{
arr[k] = i;
if (k == n)
{
display(n);
}
else
{
nQueens(k + 1, n);
}
}
}
}
// Helper Function to check if queen can be placed
static boolean canPlace(int k, int i)
{
for (int j = 1; j <= k - 1; j++)
{
if (arr[j] == i ||
(Math.abs(arr[j] - i) == Math.abs(j - k)))
{
return false;
}
}
return true;
}
// Function to display placed queen
static void display(int n)
{
breakLine();
System.out.print("Arrangement No. " + ++no);
breakLine();
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (arr[i] != j)
{
System.out.print("\t_");
}
else
{
System.out.print("\tQ");
}
}
System.out.println("");
}
breakLine();
}
// Driver Code
public static void main(String[] args)
{
int n = 4;
nQueens(1, n);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python code to for n Queen placement
class GfG:
def __init__(self):
self.MAX = 10
self.arr = [0] * self.MAX
self.no = 0
def breakLine(self):
print("\n------------------------------------------------")
def canPlace(self, k, i):
# Helper Function to check
# if queen can be placed
for j in range(1, k):
if (self.arr[j] == i or
(abs(self.arr[j] - i) == abs(j - k))):
return False
return True
def display(self, n):
# Function to display placed queen
self.breakLine()
self.no += 1
print("Arrangement No.", self.no, end = " ")
self.breakLine()
for i in range(1, n + 1):
for j in range(1, n + 1):
if self.arr[i] != j:
print("\t_", end = " ")
else:
print("\tQ", end = " ")
print()
self.breakLine()
def nQueens(self, k, n):
# Function to check queens placement
for i in range(1, n + 1):
if self.canPlace(k, i):
self.arr[k] = i
if k == n:
self.display(n)
else:
self.nQueens(k + 1, n)
# Driver Code
if __name__ == '__main__':
n = 4
obj = GfG()
obj.nQueens(1, n)
# This code is contributed by vibhu4agarwal
C#
// C# code to for n Queen placement
using System;
class GfG
{
static void breakLine()
{
Console.Write("\n---------------------------------\n");
}
static int MAX = 10;
static int []arr = new int[MAX];
static int no;
// Function to check queens placement
static void nQueens(int k, int n)
{
for (int i = 1; i <= n; i++)
{
if (canPlace(k, i))
{
arr[k] = i;
if (k == n)
{
display(n);
}
else
{
nQueens(k + 1, n);
}
}
}
}
// Helper Function to check if queen can be placed
static bool canPlace(int k, int i)
{
for (int j = 1; j <= k - 1; j++)
{
if (arr[j] == i ||
(Math.Abs(arr[j] - i) == Math.Abs(j - k)))
{
return false;
}
}
return true;
}
// Function to display placed queen
static void display(int n)
{
breakLine();
Console.Write("Arrangement No. " + ++no);
breakLine();
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (arr[i] != j)
{
Console.Write("\t_");
}
else
{
Console.Write("\tQ");
}
}
Console.WriteLine("");
}
breakLine();
}
// Driver Code
public static void Main(String[] args)
{
int n = 4;
nQueens(1, n);
}
}
// This code contributed by Rajput-Ji
Javascript
输出:
---------------------------------
Arrangement No. 1
---------------------------------
_ Q _ _
_ _ _ Q
Q _ _ _
_ _ Q _
---------------------------------
---------------------------------
Arrangement No. 2
---------------------------------
_ _ Q _
Q _ _ _
_ _ _ Q
_ Q _ _
---------------------------------