问题:n行n列的棋盘,放n个皇后,问对于给定的N,求出有多少种合法的放置方法。
重点:即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。否则会发生互相攻击。
思路:
1。首先生成map【maxn】【maxn】表格,并对其进行初始化,可以放棋的地方初始化为0;
2。每放一个皇后,这个皇后所在的横排、竖排、斜排都不能再放其他皇后。记为i;
3。用递归,可以遍历所以情况,当放棋子的地方错误时,要对其上一步的标记进行更改,即变i为0;
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=12;
void fbs(int num);
int map[maxn][maxn],t[maxn],ans,n;\\ans计数,放全局变量好变化(^U^)ノ~YO
int main()
{
for(n=1;n<maxn;++n)\\不同数目的皇后
{
ans=0;\\初始化
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
map[i][j]=0;\\初始化
fbs(1);\\先放一个皇后进函数,函数中会有递归;
t[n]=ans;
}
int q;
while(~scanf("%d",&q),q)
printf("%d\n",t[q]);
return 0;
}
void fbs(int num)
{
if(num==n+1)\\每种方法下到最后一个皇后;
{
ans++;
return ;
}
for(int col=1;col<=n;++col)
{
if(map[num][col]==0)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if((num==i||col==j||abs(i-num)==abs(col-j))&&map[i][j]==0)
{
map[i][j]=num;\\第num个皇后引起的不能再放其他皇后的地方,记为num;
}
fbs(num+1);
for(int i=1;i<=n;++i)\\下错了,返回上一步,让上一步的num换为可以下的0区域;
{
for(int j=1;j<=n;++j)
{
if(map[i][j]==num)
map[i][j]=0;
}
}
}
}
}
end:结束了,加油啊~kkkkヾ(◍°∇°◍)ノ゙