28附加题 八皇后问题
来源:互联网 发布:小米6相机在那清除数据 编辑:程序博客网 时间:2024/05/11 23:38
<pre name="code" class="java">/*剑指offer上解决八皇后问题,没有用传统的递归或非递归回溯法,而是用了很巧妙的全排列法先说下八皇后问题:在8 X 8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处于同一行,同一列或者同意对角线上,求出所有符合条件的摆法。 全排列解决八皇后问题的思路如下:由于8个皇后不能处在同一行,那么肯定每个皇后占据一行,这样可以定义一个数组A[8],数组中第i个数字,即A[i]表示位于第i行的皇后的列号。先把数组A[8]分别用0-7初始化,接下来对该数组做全排列,由于我们用0-7这7个不同的数字初始化数组,因此任意两个皇后肯定也不同列,那么我们只需要判断每个排列对应的8个皇后中是否有任意两个在同一对角线上即可,即对于数组的两个下标i和j,如果i-j==A[i]-A[j]或i-j==A[j]-A[i],则认为有两个元素位于了同一个对角线上,则该排列不符合条件。*/
package question28;public class CubVertex { static int count=0;public static void main(String[] args) {// TODO Auto-generated method stubint A[] = {0,1,2,3,4,5,6,7}; cubVertex(A,8,0); System.out.println("总共有 "+count+" 个");}private static void cubVertex(int[] A, int len, int begin) {// TODO Auto-generated method stubif (A==null||len!=8) {return;}if (begin==len-1) {boolean can=true;for (int i = 0; i < len; i++) {for (int j = i+1; j < len; j++) {if (i-j==A[i]-A[j]||j-i==A[i]-A[j]) {can=false;break;}}}if (can) {for (int k : A) {System.out.print(k+" ");}count++;System.out.println();}}else {for (int i = begin; i < len; i++) {swap(A,begin,i);cubVertex(A, len, begin+1);swap(A, begin, i);}}}private static void swap(int[] A, int begin, int i) {// TODO Auto-generated method stubint temp=A[begin];A[begin]=A[i];A[i]=temp;}}
测试结果:
0 0
- 28附加题 八皇后问题
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 每日一题17:八皇后问题
- 三星题 6.20八皇后问题
- [C语言入门题] 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题(2)
- 八皇后问题(3)
- 八皇后问题
- 八皇后问题程序
- 浅谈八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 第二次XSS测试
- [kuangbin带我飞]数位DP F(x)
- 利用jclasslib修改java编译后的.class文件
- iOS蓝牙开发(一)蓝牙相关基础知识
- chapter 1:计算机系统漫游
- 28附加题 八皇后问题
- [Database] 数据库索引-聚合索引与非聚合索引
- POJ 1789
- 1.【排序】Merge Sorted Array--Accepted Java code
- AngularJS 过滤器
- Android轮播图的实现
- 五分钟学会 Canvas 基础(一)
- 概述 RequireJS是一个工具库,主要用于客户端的模块管理。它可以让客户端的代码分成一个个模块,实现异步或动态加载,从而提高代码的性能和可维护性。它的模块管理遵守AMD规范(Asynchronou
- Android中DrawerLayout的使用,也就是侧滑菜单的使用