剑指Offer面试题28:字符串的排列之相关题目

1.输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体三组相对的面上的4个顶点的和都相等
这里写图片描述
其实这道题跟字符串的排列是一样的,相当于先得到a1,a2,a3,a4,a5,a6,a7,a8这8个数字的所有排列,然后判断有没有某一个排列符合题目给定的条件,即
a1 + a2 + a3 + a4 == a5 + a6 + a7 + a8
a1 + a3 + a5 + a7 == a2 + a4 + a6 + a8
a1 + a2 + a5 + a6 == a3 + a4 + a7 + a8

package swordoffer.chapter4;

import java.util.ArrayList;
import java.util.Arrays;

public class Interview28About1 {
    public static void main(String[] args){
        Interview28About1 i = new Interview28About1();
        ArrayList<String> list = new ArrayList<>();
        int[] num = {1,2,3,4,5,6,7,8};
        i.isEightPoint(num,list);
    }
    public void isEightPoint(int[] num,ArrayList<String> list){
        if (num == null)
            return;
        Permutation(num,0,list);
    }
    private void Permutation(int[] num,int begin,ArrayList<String> list){
        int end = num.length - 1;
        if (begin == end) {
            int a1 = num[0],a2 = num[1],a3=num[2],a4=num[3],a5 = num[4],a6 = num[5],a7 = num[6],a8 = num[7];
            if (list.contains(Arrays.toString(num))) {
                if ((a1 + a2 + a3 + a4 == a5 + a6 + a7 + a8) && (a1 + a3 + a5 + a7 == a2 + a4 + a6 + a8) && (a1 + a2 + a5 + a6 == a3 + a4 + a7 + a8))
                    list.add(Arrays.toString(num));
                return;
            }
        }
        for(int i = begin;i<= end;i++){
            int temp = num[begin];
            num[begin] = num[i];
            num[i] = temp;
            Permutation(num,begin+1,list);
            temp = num[begin];
            num[begin] = num[i];
            num[i] = temp;
        }
    }
}

2.在8*8的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后不得处在同一行、同一列或者同一对角线上。请问一共有多少种符合条件的摆法?
思路分析:由于8个皇后任意两个不能处在同一行,那么肯定每个皇后占据一行。于是我们可以定义一个数组ColumnIndex[8],数组的第i个数字表示位于第i行皇后的列号。先把数组的8个数字用0~7初始化,接下来是对数组ColumnIndex的全排列。因为我们是用不同的数字初始化数组,所以任意两个皇后肯定不同列。我们只需要判断每一排列对应的8个皇后是不是在同一对角线上,也就是对于数组的两个下标i和j,是不是i-j = ColumIndex[i] - ColumnIndex[j]或者j - i =ColumIndex[i] - ColumnIndex[j]

package swordoffer.chapter4;

import java.util.ArrayList;
import java.util.Arrays;

public class Interview28About2 {
    public static void main(String[] args){
        Interview28About2 i = new Interview28About2();
        ArrayList<String> list = new ArrayList<>();
        int[] queen = {0,1,2,3,4,5,6,7};
        i.EightQueen(queen,list);
        System.out.println(list.size());
    }
    public void EightQueen(int[] queen,ArrayList<String> list){
        Permutation(queen,0,list);
    }
    private void Permutation(int[] queen,int begin,ArrayList<String> list){
        if (begin == queen.length - 1){
            for (int i=0;i < queen.length;i++){
                for (int j =i + 1;j < queen.length;j++){
                    if ((i - j == queen[i] - queen[j]) ||(j - i == queen[i] - queen[j]))
                        return;
                }
            }
            list.add(Arrays.toString(queen));
            return;
        }
        for (int i = begin;i < queen.length;i++){
            int temp = queen[begin];
            queen[begin] = queen[i];
            queen[i] = temp;
            Permutation(queen,begin+1,list);
            temp = queen[begin];
            queen[begin] = queen[i];
            queen[i] = temp;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值