Java实现8皇后算法
来源:互联网 发布:查看mysql端口号 编辑:程序博客网 时间:2024/06/06 07:39
八皇后是一道很具典型性的题目。它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。
初看到这道题目,大家的第一印象是遍历,但是经过实践之后发现遍历其实不好写,而且复杂度很低。不仅需要遍历8*8*8*8*8*8*8*8*8 = 2^24次数据,还要判断各种条件,实际的计算复杂度还要比较这个高。其实我们仔细看一看,这中间很多的计算其实很多是不需要的,因为如果我们在某一行没有可以插入的数据的话,那么这后面的行其实就不用考虑了。也就是说,我们只有在保证前面 插入的物体都合法有效的情况下,才能进行下一次的物体插入。无谓的遍历只会是无用功。
那么,我们应该怎么做呢?其实步骤不太难:
(1)在第n行寻找可以插入的位置,中间涉及到位置合法性的判断
(2)如果没有可以插入的位置,返回
(3)如果有可以插入的位置, 插入数据。此时再判断是否已经是最后一行,如果是,打印输出返回;反之继续对下一行数据进行试探处理。
写法如下
public static int num = 0;//累计方案public static final int MAXQUEEN = 8;public static int[] cols = new int[MAXQUEEN];//定义cols数组,表示8列棋子皇后摆放的位置public void FromJava() { getCount (0);} public void getCount(int n){ boolean [] rwn =new boolean[MAXQUEEN]; for (int m =0;m<n;m++){ rwn[cols[m]]=true; int d =n-m ; if (cols[m]-d>=0){ rwn[cols[m]-d]=true; } if (cols[m]+d<MAXQUEEN-1){ rwn[cols[m]+d]=true; } } for ( int i=0;i<MAXQUEEN;i++) { if (rwn[i]) { continue; } cols[n]=i; if (n<MAXQUEEN-1){ getCount(n+1); }else { num++ ; printQueen(); } } }private void printQueen() { System.out.println("第"+num+"种方案"); for(int i = 0;i<MAXQUEEN;i++){ for(int j = 0;j<MAXQUEEN;j++){ if(i == cols[j]){ System.out.print("0 "); }else{ System.out.print("+ "); } } System.out.println(); }}
阅读全文
0 0
- Java实现8皇后算法
- 8皇后问题(java算法实现)
- 八皇后 Java算法实现
- <转载> 8皇后问题(java算法实现)
- java实现N皇后迭代算法
- java实现N皇后递归算法
- 算法复习 - 八皇后问题(Java实现)
- java分治算法实现n皇后问题
- java实现八皇后问题算法
- java实现8皇后问题
- N皇后Java算法
- 八皇后问题 java实现,算法两则
- 回溯法实例―n皇后算法 (java实现)
- 八皇后java实现
- 八皇后java实现
- 八皇后 java实现
- java实现皇后问题
- 八皇后 java实现
- Linux 每天都学习新指令
- go
- linux查看系统版本
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 梯度消失(vanishing gradient)和梯度爆炸(exploding gradient)
- Java实现8皇后算法
- 怎么计算Oracle的表一条记录占用空间的大小
- 谷歌AutoML击败人类工程师,图像识别准确率达82%
- 曾患乳腺癌的MIT女教授,使用人工智能检测早期乳腺癌,准确率97%
- 拍人更美!谷歌工程师揭秘Pixel 2手机黑科技
- 运算能力提升百倍!英特尔联手Facebook发布首款神经网络处理器
- HDU1710 Binary Tree Traversals(DFS,二叉树的遍历)
- 拉格朗日乘子法和KKT条件
- ASP.NET内置对象