剑指offer:八皇后问题
2014-04-17 12:45
274 查看
相信大家都知道经典的八皇后问题,我们本次不用回溯法求解八皇后问题,我们采用这样的方法,自己定义一个数组,初始数组
为{0,1,2,3,4,5,6,7},则数组下标代表行,数组中元素代表列,这样就不会出现两个或者两个以上的数组元素在同一行或者同一列的情况,我们只需要考虑对角巷的情况就可以了,,只要保证两个或者多个元素不在同一对角线上就行了,显然这个对角线分为主对角线和副对角线。
下面是运行的程序:
PS:如果面试题是按照一定要求摆放若干个数字,我们可以先求出这些数字的所有排列,然后再一一判断每个排列是不是满足所给定的要求。
为{0,1,2,3,4,5,6,7},则数组下标代表行,数组中元素代表列,这样就不会出现两个或者两个以上的数组元素在同一行或者同一列的情况,我们只需要考虑对角巷的情况就可以了,,只要保证两个或者多个元素不在同一对角线上就行了,显然这个对角线分为主对角线和副对角线。
下面是运行的程序:
package com.interview; /* * 经典的八皇后问题 */ public class EightQueen { private int sum = 0; public int[] Char2Int(char[] c) { int[] a = new int[c.length]; for (int i = 0; i < c.length; ++i) a[i] = c[i] - '0'; // 这里我们定义了一个数组,数组的下标代表行,数组中元素代表列 return a; // 这样我们就可以在定义的时候规避八皇后问题的不在同一行和不再同一列的问题 } public void listAll(String body, String prefix) { if (body.length() < 1) { char[] tmp = prefix.toCharArray(); int[] tmp_arr = Char2Int(tmp); boolean tag = false; outer: for (int i = 0; i < tmp_arr.length - 1; ++i) { for (int j = i + 1; j < tmp_arr.length; ++j) { if (i - j == tmp_arr[i] - tmp_arr[j] || (i + tmp_arr[i]) == (j + tmp_arr[j])) { tag = true; // 只要碰到一个在对角线上的情况,则条状整个循环 break outer; } } } if (!tag) { //if (sum % 4 == 0) //System.out.println(); for (int i = 0; i < tmp_arr.length; ++i) System.out.print(tmp_arr[i] + " "); sum++; System.out.println(); } } else { for (int i = 0; i < body.length(); ++i) { listAll(body.substring(1), prefix + body.substring(0, 1)); body = body.substring(1) + body.substring(0, 1); } } } public static void main(String[] args) { EightQueen eq = new EightQueen(); String body = "01234567"; eq.listAll(body, ""); System.out.println("\n\n八皇后问题的解法公有:\t" + eq.sum); } }
PS:如果面试题是按照一定要求摆放若干个数字,我们可以先求出这些数字的所有排列,然后再一一判断每个排列是不是满足所给定的要求。
相关文章推荐
- 面试经典之剑指offer--58--八皇后问题
- 【剑指offer】八皇后问题
- 【剑指offer】八皇后问题
- 【剑指Offer】斐波那契数列及其延伸问题——JavaScript实现
- <未完成状态>剑指offer_圆圈中最后剩下的数字(约瑟夫问题)
- 剑指offer:(27)分解让复杂问题简单化 :二叉搜索树与双链表
- 剑指offer 4.3 举例形象化问题5-二叉树中和为某一值的路径
- 01-复杂度1 最大子列和问题(剑指offer和PAT)
- 【剑指offer】4.3举例让抽象问题具体化——面试题21:包含min函数的栈
- 剑指offer——面试题39:扩展问题判断一个树是否是平衡二叉树(递归)
- 剑指offer——年龄排序问题
- (C++)剑指offer-27:字符串的排列(分解让复杂问题简单)(没太懂)
- 剑指offer:(26)分解让复杂问题简单化 :复杂链表的复制
- 剑指offer——链表相关问题总结
- 剑指offer青蛙跳台阶问题
- 剑指offer——约瑟夫环问题
- 剑指offer 4.3 举例形象化问题4-二叉搜索树的后续遍历序列
- 【剑指offer】4.3举例让抽象问题具体化——面试题22:栈的压入、弹出序列
- 异形数问题-剑指offer40题
- 剑指offer面试题9-斐波那契数列问题