lightoj1061 (N Queen Again)搜索+状压dp

本文探讨了一种八皇后问题的变形,要求确定最少移动次数使所有皇后不再相互攻击。通过枚举所有合法的八皇后布局,并使用动态规划(dp)策略,匹配给定的皇后位置子集,找到最小步数解决方案。在解决过程中,作者提出一种假设,即通过调整皇后移动顺序,可以避免移动过程中的阻挡问题。文中附带了解决问题的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:(八皇后问题的变形)给定8个皇后的位置,然后问最少要走几步使得每个皇后之间可以不相互攻击(不在同一行同一列同一斜线)。其中走的过程每步可以横着竖着斜着走多个格子。


解法:先枚举所有合法的八皇后局面(总共92种)。然后将给的点对合法八皇后局面进行匹配。dp[i][j]表示合法八皇后前i个点用掉给定八皇后集合的子集j所花费的最小步数。这里的匹配相当于两个集合各八个点,进行一一配对。原来想的是ans[i][j]的i是合法皇后状态子集,但是这样会有增加好多复杂度。前边的dp[i][j]可以在8*255*8的复杂度内解决问题。如果是后者则是8*8*255*255.再加上有个92就超时了。

   ps:这里有个假设,就是如果匹配完之后,一定可以有个顺序使得每个皇后都可以顺利走到匹配的位置而不被其他皇后挡住。我的理解是这样:如果要走的一个匹配被其他某个皇后挡住了,那么会分为两种情况:1 挡道的皇后是移动之后的 解决这个就是交换他们的移动顺序。  2 挡道的皇后是移动之前 依然是交换他们的移动顺序。并且这里不会出现A移动之前挡住B,移动之后依然挡住B的情况,否则就交换他们的目标位置(不会增加步数,画图可以看出)。


代码:

/****************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值