N皇后问题:有一个N*N的棋盘,要在棋盘上放N个皇后,要求这N个皇后的位置不能同行同列同对角线。
解决:放入第i个皇后时,应该与前面i-1个皇后都不冲突,即都不同行同列同对角线,满足则放下不满足则换位置,若第i行所有位置都不满足则回溯到第i-1个皇后,让第i-1个皇后换位置直至满足要求。
注意:回溯的话就必定要做标记,可以建立一个N*N的二维数组,初始化为0,0代表没尝试过,2代表冲突,1代表合适。注意第i行所有都不是合适时,应将第i行全部置0,然后回溯到i-1行,使原来的值变为2。
代码:
#include<iostream>
#include<cmath>
using namespace std;
bool isValid(int *columns, int r) //columns[r]=c表示有个皇后位于r行c列。
{
for(int i=0; i<r; i++)
{
if(columns[i]==columns[r])
{
return false;
}
else if(abs(columns[i]-columns[r])==r-i)
{
return false;
}
}
return true;
}
int main()
{
int table[8][8]={0};
int columns[8]={0};
for(int i=0; i<8; i++)
{
for(int k=0; k<8; k++)
{
if(table[i][k]==0)
{
columns[i]=k;
if(isValid(columns, i))
{
table[i][k]=1;
break;
}
else
{
table[i][k]=2;
}
}
if(k==7)
{
for(int j=0; j<8; j++)
{
table[i][j]=0;
}
i--;
table[i][columns[i]]=2;
i--;
}
}
}
for(int i=0; i<8; i++)
{
cout << columns[i] << endl;
}
}