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; }