八皇后问题

广搜----poj1321棋盘问题

 

棋盘问题 poj1321;

八皇后问题 小白书P123

 

棋盘问题对着答案已经看了两天,还是哏不懂dfs是为什么那样子写,看到博客上说和八皇后问题很像,就去看了看小白书上的八皇后问题;

 

八皇后问题简要:在一个8*8的棋盘上放置八个皇后,使得她们不能互相攻击;每个皇后都会攻击她们同行同列同对角线的其他皇后,所以请找出有多少方案放置皇后;

这个问题是八个皇后要在一个八行八列的棋盘上按着规则放置,引申一下:但是如果说要让七个皇后在8*8的棋盘上按照相同规则放置将会有多少方案nie   ~( ̄▽ ̄)~*  

那么这就与棋盘问题更相似了;

 

我们先考虑八皇后问题:

代码:

void searc(int cur)
{
    int i,j;
    if(cur==k) tot++;
    else
    for(i=0;i<n;i++)
    {
        if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
//列,主对角线,副对角线,详见P125图
        {
            vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
            searc(cur+1);
            vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
        }
    }
}

当然这个代码只能解决的是基本八皇后问题;


接下来我们来考虑棋盘问题,如下所示:

/*

5 4
....#
...#.
..#..
.#...
#....
*/
Given 这样一个棋盘,求满足方案数;
void dfs(int cur)
{
if(m==k)
{  tot++; return;  }
    if(cur>=n) return ;
    for(int i=0;i<n;i++)
    {
        if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
        {
            vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
            m++;
            dfs(cur+1);
            vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0; //一定要写上回溯的时候会运行这两步;
            m--;
        }
    }
    dfs(cur+1); 
}


这个是在模拟八皇后问题的程序的时候明白了一点,但是具体的回溯过程还是云里雾里的,需要找大神问问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值