剑指38:全排列拓展——正方体三面 +八皇后问题

1、正方体三面问题

题目1
输入一个含有8个数字的数组,判断有么有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和相等。

思路
相当于求出8个数字的全排列,判断有没有一个排列符合题目给定的条件,即三组对面上顶点的和相等。而关于寻找全排列这篇博文一样:http://blog.csdn.net/u010412719/article/details/48980787

#include<stdio.h>
#include<stdlib.h>
#include<iostream>

#define N  8

using namespace std;

bool equalOfOppositeSumInCubVertix(int *arr,int len,int begin){
    if(!arr||len!=8)
        return false;
    //sort(arr+begin,arr+len);
    bool result = false;
    if(begin==len-1){          //全排列到某时 完成正方体三面判定
        if((arr[0]+arr[1]+arr[2]+arr[3] == arr[4]+arr[5]+arr[6]+arr[7])&&
           (arr[0]+arr[2]+arr[4]+arr[6]==arr[1]+arr[3]+arr[5]+arr[7])&&
           (arr[0]+arr[1]+arr[4]+arr[5]==arr[2]+arr[3]+arr[6]+arr[7]))
            {
                for(int i=0;i<len;i++)
                    cout<<arr[i]<<' ';
                cout<<endl;
                return true;
            }
    }
    for(int i = begin;i<len;i++){
        swap(arr[i],arr[begin]);
        result=equalOfOppositeSumInCubVertix(arr,len,begin+1);
        swap(arr[i],arr[begin]);
        if(result)  //只打印第一个或者都打印
            break;
    }
    return result;
}

int main(void){
    int arr[N]={2,3,3,4,5,6,7,8};
    if(equalOfOppositeSumInCubVertix(arr,N,0)){
        printf("YES");
    }
    else{
        printf("NO");
    }
    getchar();
    getchar();
}

八皇后问题——全排列方法

https://blog.csdn.net/ns_code/article/details/26614999

题目:

在8 X 8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处于同一行,同一列或者同意对角线上,求出所有符合条件的摆法。

思路:剑指offer给出

用数组的下标表示 行  数组内容表示列

寻找符合 i-j ==arry[i]-arry[j]或者 i-j==arry[j]-arry[i]的 这样都是对角线 不成立

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
static int count=0;
void Queue(int len,int* arry,int begin){
    bool flag = true;
    if(begin == len-1){
        for(int i=0;i<len-1;i++)
            for(int j=i+1;j<len;j++)
                if(abs(i-j)==abs(arry[i]-arry[j]))
                {
                    flag = false;
                    break;
                }

        if(flag)
        {
            for(int i=0;i<len;i++)
                cout<<arry[i];
            cout<<endl;
            count++;
        }
    }
    for(int i=begin;i<len;i++){
        swap(arry[i],arry[begin]);
        Queue(len,arry,begin+1);
        swap(arry[i],arry[begin]);
    }
}

int main(){
    cout<<"几皇后"<<endl;
    int len;
    scanf("%d",&len);
    int* arry = new int[len];
    for(int i=0;i<len;i++)
        arry[i]=i;
    Queue(len,arry,0);
    cout<<count;
    getchar();
    getchar();
    return 0;
}


猜你喜欢

转载自blog.csdn.net/yanbao4070/article/details/80065853