#include<iostream>
using namespace std;
int vis[3][30];//分别表示列,主对角线和副对角线是否被占用,若用(row,col)表示第row行第col列位置(row,col)均从0开始
//则列所在位置为col,主对角线所在位置为n-row+col,副对角线所对应的位置为row+col
int ans ,MAXN;
void dfs(int row)
{
if (row == MAXN)
{
++ans;
return ;
}
else
{
for (int col =0; col <MAXN; ++col)
{
if (!vis[0][col] && !vis[1][col+row] && !vis[2][MAXN-row+col])
{
vis[0][col] = vis[1][col+row] = vis[2][MAXN-row+col] = 1;
dfs(row+1);
vis[0][col] = vis[1][col+row] = vis[2][MAXN-row+col] = 0;
}
}
}
}
int PlaceQueenMethodNum(int n)
{
/*在这里实现功能*/
MAXN =n;
ans =0;
memset(vis,0,sizeof(vis));
dfs(0);
return ans;
}
int main()
{
ans =0;
int last[11];
for (int i=1; i < 11; ++i)
{
ans =0;
last[i] = PlaceQueenMethodNum(i);
}
int n;
while (cin>>n && n != 0)
{
cout<<last[n]<<endl;
}
return 0;
}
N皇后问题
最新推荐文章于 2024-01-20 20:51:42 发布