第一次实验—NPC问题(回溯算法、聚类分析)

1) 八皇后及N皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

    请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题。


思路:采用回溯思想,遍历所有行,从矩阵的第一行第一列开始查找可以放置皇后的安全位置,若找到安全位置则往下一行查找安全位置,直至遍历结束。若当前行的所有列均不安全,则回溯到上一行,从上一行的下一列再继续查找。。。

输出的解以8皇后问题为例,N皇后问题只需修改皇后的数量。用java实现,代码如下:

  1. public class Queens {  
  2.     int num ; // 皇后数量  
  3.     int [] queenArray ; // 存储可行方案的皇后们的位置  
  4.     int count = 0// 解决方案的数量  
  5.       
  6.     /** 
  7.      * 初始化 
  8.      * @param num 皇后的数量 
  9.      */  
  10.     public Queens(int num){  
  11.         this.num = num;          
  12.         queenArray = new int[num];  
  13.     }  
  14.       
  15.     /** 
  16.      * 判断当前行放置了皇后是否会与前面几行放置的皇后们发生冲突 
  17.      * @param row 
  18.      * @return 
  19.      */  
  20.     public boolean isSafe(int row){  
  21.         for(int r=0; r<row; r++){    
  22.             // 发生冲突的条件:皇后们在同一行(此处不用判断是否同一行)、同一列、  
  23.             if(queenArray[row] == queenArray[r] ||   
  24.                     // 同一对角线(斜率=(y2-y1)/(x2-x1)= +1或-1 )  
  25.                     Math.abs(queenArray[row]-queenArray[r]) == Math.abs(row-r))  
  26.                 return false;  
  27.         }  
  28.           
  29.         return true;          
  30.     }  
  31.       
  32.     /** 
  33.      * 回溯查找解决n皇后问题的方案 
  34.      * @param row 第几行 
  35.      */  
  36.     public void backTrack(int row){  
  37.         // 找到一个放置所有皇后而不发生冲突的方案,打印出来  
  38.         if(row == num){  
  39.             count++;  
  40.             print();  
  41.             return;  
  42.         }  
  43.             
  44.          // 未遍历到最后一行,查找当前行的某个适合放置皇后的列  
  45.         for(int col = 0; col < num; col++)  
  46.         {         
  47.             queenArray[row] = col;    
  48.             //当前行的某个列适合放置皇后,往下一行查找  
  49.             if(isSafe(row))  
  50.                 backTrack(row+1);    
  51.         }  
  52.     }      
  53.   
  54.     public void print(){  
  55.         System.out.println("方案 "+count+":");  
  56.         for(int i=0; i<num; i++){  
  57.             for(int j=0; j<num; j++){  
  58.                 if(j == queenArray[i])  
  59.                     System.out.print("Q ");  
  60.                 else  
  61.                     System.out.print("X ");  
  62.             }  
  63.             System.out.println();  
  64.         }  
  65.         System.out.println("\n");  
  66.     }  
  67.       
  68.       
  69.     public static void main(String[] args) {  
  70.         Queens queens = new Queens(8);          
  71.         queens.backTrack(0);  
  72.     }  
  73.   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
易语言经典算法:1. 取所有质数 2. 求最小公倍数 3. 求最大公约数 4. 汉诺塔 5. 9X9乘法表 6. 猫捉老鼠(筛选法) 7. 水仙花数问题 8. 计算组合 9. 身份证升级15位升级到18位 10. 用冒泡法排序数字 11. 九宫计算 12. 奶牛问题 13. 求阶乘 14. 折半查找 15. 给歌手打分 16. 航线设置 17. 数字全排列 18. 借书方案 19. 求直角三角形 20. 二分排序 21. 抢30 22. 求回文数 23. 斐波那契数列(递推法) 24. 分块查找 25. 求帕斯卡三角(杨辉三角) 26. 箱子问题(贪婪法) 27. 寻找文件(递归法) 28. 求最大公约数(递归法) 29. 取不重复数(排除法) 30. 拉丁方 31. 波松瓦分酒 32. 皇后问题 33. 背包问题 34. 角谷猜想 35. 邮票组合 36. 贮油点 37. 分解质因数 38. 任意进制转换(大数) 39. 计算星期几(常用公式) 40. 计算星期几(蔡勒公式) 41. 猴子吃桃子 42. 马踏棋盘 43. 打鱼还是晒网 44. 九位累进可除数 45. 十进制转为二进制 46. 九连环 47. 找窃贼 48. 哥德巴赫猜想 49. 最小生成数 50. 农夫过河 51. 旅游最省钱路径 52. 马克思手稿中的数学题 53. 上楼梯(递归).e 54. 上楼梯(非递归) 55. 金额大小写转换 56. 求一元二次方程的根(二分法) 57. 数字与IP地址间的转换 58. 八皇后问题(回溯法) 59. 求N阶幻方 60. 计算分数的精确值 61. 找零钱 62. 求一元二次方程的根(公式法) 63. 比赛日程(分治法) 64. 两个有序数组的合并 65. 统计投色子(2个)的结果 66. 12小球问题 67. 改进冒泡排序法 68. 螺旋数组 69. 射击环数 70. 猜数字游戏 71. 桶排序 72. 造币厂问题 73. 直接插入排序 74. 搬砖 75. 公车座位巧安排 76. 韩信点兵(中国剩余定理) 77. 黑洞数 78. 矩阵相乘 79. 螺旋矩阵问题(多循环法) 80. 买水果问题 81. 求平方根 82. 求任意三角形面积 83. 全排列问题(递推法) 84. 怎样组合值最大 85. 取两数之间均匀分布的随机数

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值