《剑指Offer》面试题:三组对面和分别相等的正方体

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

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

具体实现代码如下




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

#define N  8

void swap(int *a,int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
} 
bool equalOfOppositeSumInCubVertix(int *arr,int len,int begin){
    if(arr==NULL||len!=8){//判断输入的参数是否有效 
        return false;
    }
    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++){
                printf("%d ",arr[i]);
            }
            printf("\n");
            result= true;
        }
    }
    else{
        for(int i=begin;i<len;i++){
            swap(&arr[begin],&arr[i]);
            result=equalOfOppositeSumInCubVertix(arr,len,begin+1);
            if(result){ //这条语句的作用就是:当我们找到一条满足条件的组合后然后就全部退出。,如果没有这条语句,则会打印出所有符合条件的组合。 
                break;
            }
            swap(&arr[i],&arr[begin]);
        }

    }
    return result; 
}
int main(void){
    int arr[N];
    for(int i=0;i<N;i++){
        scanf("%d",&arr[i]);
    }
    if(equalOfOppositeSumInCubVertix(arr,N,0)){
        printf("YES"); 
    }
    else{
        printf("NO");
    }
}

运行结果如下

上图中第一行为输入,第二行为符合条件的结果的组合。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值