八皇后java_用Java写八皇后问题

日常笔记记录系列……

前言:编码5分钟,bug两小时……

八皇后问题,挺经典的一个问题。网上各种解法的教程……

一般有两种想法:

1.枚举

2.递归调用

枚举就不提了,用8个for循环,每一个for循环从1到8,把所有的可能性全部找出来后,再去判断这种解法是不是合理。8皇后的棋盘总共可能有2000多万种可能性,而实际解法只有92种,效率太低太低。

所以用回溯法,递归调用的方式求解。

需要写一个方法来判断当前的摆放位置是否合法;再写一个递归方法求解出所有的解决方案。每当找到一个解决方案,就将这个解决方案绘制到面板中,然后将所有的面板add到一个大面板中,最后将大面板add到frame中。

最坑的是使用swing把所有解决方案画出来的这个过程。paintComponent(Grahpics g)这个方法是真坑,它是JVM自动调用的,而且调用的时刻是:当前的组件需要显示时候才会调用。也就是说如果在一张解决方案面板上面画好了皇后位置,但是这个窗口并没有显示,那是看不到这个解决方案的……

由于是想把所有的解决方案面板都找出来,最后一起添加到窗口中显示出来,而递归方法调用结束后,皇后位置数组queens[]总是为{7,7,7,7,7,7,7,7},也就导致JVM在调用paintComponent()方法使用queens[]数组来画出皇后位置时,总是将皇后画在最后一列……解决方法就是每找到一个解决方案,把这个解决方案数组添加到链表LinkedList中去……

===============================

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值