又见皇后!!!

这道题算是N个皇后的拓展问题,但是这个问题需要的时间很多。


国际象棋中,皇后能攻击同一横线、同一竖线、同一斜线(45度)的敌人。

众所周知,有一个非常著名的算法问题,是求在一个n×n的国际象棋棋盘中最多能摆放多少个皇后,使其不能相互攻击。

今天我们暂且不要让问题如此理想化。假设棋盘上有一些障碍物,皇后不能摆在障碍物上,同时也不能穿过障碍物攻击别人。在此条件之下,棋盘上最多又能放多少个皇后?

                           

图中黑色方块表示障碍物,圆点表示皇后

2是一种最优摆法;图4、图5属于违规摆法

Input
输入包含多组数据。

每组数据的第一行是一个整数n1n8),表示棋盘的边长。之后的n行将描述棋盘,其中’X’表示该单元格有障碍物,’.’则表示没有。

n=0表示输入结束。

Output
对于每组数据,请输出一个整数表示最多能在棋盘上放几个皇后,使它们相互不能攻击。
每个答案占一行。


这个题看起来十分的难,怕各种的超时,但是这个题就是暴力 + 递归进行操作的,而且他的时间还是比较充足的,

所以不用那么太担心。


我的思想就是,search() 左边的变量就是把二维数组进行遍历,右边的变量就是这个符合条件的情况,

而check函数就是一个进行判断的函数,如果在横向纵向或者45度倾斜的方向有皇后就不符合条件,如果在这些

方向中碰到了X就是箱子,就不用进行判断了,直接退出,由于你的k是从0开始,而且他的方向是从

(0,0) (0,1) (0,2)...(0,num-1)的方向进行的,如果这一行遍历结束了,就进入下一行,知道k到达(num-1,num-1)

程序就结束了,由于我是这样进行设置k这个变量的,所以要通过k变量的数值,把这个二维数组的横纵坐标

计算出来,

int x = k/num

int y = k%num

这样就可以通过k的值进行计算了(k = 经过了多少个二维数组元素-1  , 因为k是在0开始的)


在判断3个方向是否有皇后的过程中,其实是可以进行一下判断的,由于我的k是从一个二维数组的(0.0) 到

这个二维数组的结尾的(num-1,num-1) 简单的说k是从上倒下,从左到右的遍历的,这样就可以省略很多次的

判断,首先是横向,判断点的左边一定是k经历过的,判断点的右边k一定没有遍历到,所以,直接就可以访问

判断点的左边就可以了,同理进行纵向的判断时刻,由于k是从上到下进行遍历的,所以你只要判断判断点的上方就

可以了,判断点的下方k还没有遍历到,判断点左边的45度只要上部分就可以了,其他的一样,原因同上,判断点右边45度只要判断右上方就可以了,其他的就不用了,原因同上。


在search()函数中我使用的是递归,判断的条件是这个位置占一个皇后或者不站一个皇后,就分成了两个部分。。。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值