简单回溯N皇后问题

//回溯法,从第0行开始摆放皇后,后面每次把皇后摆放到第curRow行i位置时,
//就判断是否和前面已经摆放好了的皇后冲突
//vis[curRow]=i表示尝试把第curRow行的皇后摆放到第i列
//判断行列对角线冲突方法:
//vis[curRow]==vis[j]则列冲突
//curRow+(-)vis[curRow]==j+(-)vis[curRow]则对角线冲突
#include <stdio.h>
#define N 12
int total;
int vis[N]={0};
void search(int curRow)
{
    int i,j;
    //已经摆放好了N个皇后,则解法+1
    if(curRow==N) total++;
    else for(i=0;i<N;i++)
    {
        int flag=0;
        vis[curRow]=i;
        for(j=0;j<curRow;j++)
        {
            //冲突检测
            if(vis[curRow]==vis[j] || curRow-vis[curRow]==j-vis[j] || curRow+vis[curRow]==j+vis[j])
            {
                flag=1;
                break;
            }
        }
        if(!flag) search(curRow+1);
    }
}

int main()
{
    total=0;
    search(0);
    printf("%d",total);
    return 0;
}

其实还是借鉴的刘汝佳的方法。注意,当N>12时程序效率变得低下,所以需要再做改进。

发布了35 篇原创文章 · 获赞 12 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章