回溯法解决N皇后问题(C++)
#include<iostream>
#include <stdlib.h>
using namespace std;
int x[5];
int y[5];
int n = 4;
int m = 0;
int place(int k, int j)
{
for (int i = 1; i <= k - 1; i++)
{
if (abs(x[i] - k) == abs(y[i] - j) || y[i] == j)
{
return 0;
}
}
return 1;
}
void nQueen(int k, int j)
{
if (k == 0)
return;
while (j <= n)
{
if ((k == 1) || place(k, j))
{
x[k] = k;
y[k] = j;
k++;
j = 1;
}
else
{
j++;
}
if (j == n + 1)
nQueen(k - 1, y[k - 1] + 1);
if (x[n] != 0)
{
for (int i = 1; i <= n; i++)
cout << "(" << x[i] << "," << y[i] << ")" << endl;
cout << "************" << endl;
x[n] = 0;
m++;
}
}
if (j == n + 1)
nQueen(k - 1, y[k - 1] + 1);
}
int main()
{
x[1] = 1, y[1] = 1;
cout << n << "皇后问题的解为:" << endl;
nQueen(1, 1);
cout << n << "皇后问题共有" << m << "个不同的解" << endl;
return 0;
}