日常笔记记录系列……
前言:编码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中去……
===============================