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 true;
return 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;
}
从中我们能看出能够影响迭代加深的速度的几个因素:
- 循环所有状态的次数
- 改变状态需要消耗的速度
- 检查解的速度,这个速度相对比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