紫书 第7章 暴力求解法 习题7-10 Guarding the Chessboard UVA - 11214

博客详细分析了八皇后问题的一个变种,探讨了使用迭代加深(ID)算法解决此问题的效率。通过算法速度分析,讨论了循环次数、状态变化和解的检查速度,并提出了优化策略,包括减少状态变化的时间复杂度和循环次数优化。此外,介绍了如何通过预先设定最大循环次数来进一步加速求解过程。博客提供了AC代码实现,并总结了问题的关键在于算法速度分析和对八皇后问题的掌握。
摘要由CSDN通过智能技术生成

https://vjudge.net/status#un=&OJId=UVA&probNum=11214&res=0&orderBy=run_id&language=

https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2155

这道题目是经典的八皇后问题八皇后问题的一个衍生。
虽然问题和原八皇后问题有点出入,但是解题思路基本上还是一致的。

分析

首先,根据例题给的数据当8X8格子填满的时候的解是5。这里我们已经可以看到解的数量是远远小于整个图的状态(8X8 = 64)的。根据这个我们就已经能狗很好的推断这道题选用迭代加深(ID)算法会是一个很好的选择,因为长和宽的上限不超过9。

算法速度分析

这个是迭代加深的一个模版伪代码

bool bt(int d, int maxd) {
   
    if (maxd == d) {
   
		if (检查有解()return truereturn false}
    循环所有状态 {
   
       保存当前状态();
       改变当前状态到可能的下一次状态();
       if(bt(d + 1, maxd)) return true;
       改回当前状态();
    }
    return false;
}

int main() {
   
    for (int maxd = 0;; maxd++) {
   
        if (bt(0, maxd, 0, 0)) {
   
            打印答案();
            break;
        }
    }
    return 0;
}

从中我们能看出能够影响迭代加深的速度的几个因素:

  1. 循环所有状态的次数
  2. 改变状态需要消耗的速度
  3. 检查解的速度,这个速度相对比2)影响要小一些,因为只用考虑(d == maxd)的情况。
循环次数

首先,不管给什么样的grid,假设这道题grid的高是n,宽m,解是x,所有可能解的状态就等于在m*n的格子里选择x个格子放皇后。直接套用组合数公式就能算出总共需要
C x m ∗ n = ( m ∗ n ) ! ( m ∗ n − x ) ! x ! C_x^{m*n} = \frac {(m*n)!} {(m*n- x)!x!} C

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值