N皇后问题(递归)

问题: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ヾ(◍°∇°◍)ノ゙

猜你喜欢

转载自blog.csdn.net/weixin_40907938/article/details/81212799