《剑指Offer》面试题:三组对面和分别相等的正方体
2015-10-09 21:30
831 查看
《剑指Offer》第4章后面的相关题目
题目1
输入一个含有8个数字的数组,判断有么有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和相等。
思路
相当于求出8个数字的全排列,判断有没有一个排列符合题目给定的条件,即三组对面上顶点的和相等。而关于寻找全排列与我的这篇博文一样:http://blog.csdn.net/u010412719/article/details/48980787
具体实现代码如下
运行结果如下
上图中第一行为输入,第二行为符合条件的结果的组合。
题目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 ; for(int i=0;i<N;i++){ scanf("%d",&arr[i]); } if(equalOfOppositeSumInCubVertix(arr,N,0)){ printf("YES"); } else{ printf("NO"); } }
运行结果如下
上图中第一行为输入,第二行为符合条件的结果的组合。
相关文章推荐
- 黑马程序员——JavaSE之学习IO流的心得(一)
- 程序员如何快速准备面试中的算法
- 黑马程序员——IO流之File类、递归、Properties类
- 程序员眼中的英语
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- 《剑指Offer》面试题:字符串的组合(不用递归求解)
- 优秀程序员的45个习惯
- 面试小记-1-不重复输出[1-10000]区间数字
- 讲述程序员的发展方向
- 黑马程序员-------Foundation框架 NSRange
- 黑马程序员——Java基础---多态,内部类,异常
- 黑马程序员——Java基础---继承,抽象,接口
- 刚开博客,希望能记录下些什么
- 两道笔试题
- 【.Net码农】using的几种用法
- 黑马程序员---OC学习笔记之简单的单例模式实现
- 【July程序员编程艺术】之字符串是否包含问题
- 记:新浪微博iOS客户端开发的电话面试
- 黑马程序员---成长之路-----OC之基础篇类的继承和派生
- 2014,甲午马年,闪电辞职,马上创业