剑指OFFER————面试题28八皇后问题
2014-10-16 10:19
183 查看
八皇后问题:8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即任意两个皇后不得处在一行、同一列或者同意对角线上。请问一共有多少种摆法?
定义一个数组A【8】,数组第i个数字表示位于第i行的皇后的列号。先把数组A的八个数字初始化成0~7,接下来就是对这8个数字进行全排列,然后将符合情况的排列进行计数即可。
小贴士:
如果是按照一定要求摆放若干个数字,我们可以先求出这些数字的所有排列,然后在一一判断每个排列是不是满足题目给定的要求
#include<iostream> using namespace std; bool check_duijiao(int A[],int length){ if(A==NULL || length<=0){ return false; } for(int i = 0 ; i <= length ; ++i){ for(int j = i+1 ; j <= length ; ++j){ if( ( (i-j) == ( A[i]-A[j] ) )|| ( (j-i) == ( A[i] - A[j] ) ) ){ return false; } } } return true; } void count_case(int A[],int length,int index,int &num){ if(A==NULL || length<=0 || index<0){ return; } if(index == length){ if( check_duijiao( A, length )){ num++; } return; }else{ for(int p = index; p <= length ; ++p){ swap(A[index],A[p]); count_case(A,length,index+1,num); swap(A[index],A[p]); } } } int Queen_case(){ const int index = 8; int A[index]; for(int i = 0 ; i < index ;++i){ A[i] = i; } int result=0; count_case(A,index-1,0,result); return result; } int main(){ int i = Queen_case(); cout<<i<<endl; system("pause"); return 0; }
定义一个数组A【8】,数组第i个数字表示位于第i行的皇后的列号。先把数组A的八个数字初始化成0~7,接下来就是对这8个数字进行全排列,然后将符合情况的排列进行计数即可。
小贴士:
如果是按照一定要求摆放若干个数字,我们可以先求出这些数字的所有排列,然后在一一判断每个排列是不是满足题目给定的要求
相关文章推荐
- 剑指Offer中面试题28的扩展问题(求字符的所有组合)
- 剑指offer_面试题3_二维数组中的查找(简单问题亦不能忽视)
- 经典面试题——n皇后问题
- 《剑指Offer》面试题:八皇后问题
- 剑指offer 面试题55 字符流中第一个不重复的字符(push_back+resize出问题)
- 《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!
- 剑指offer面试题3-二维数组查找问题
- [程序员面试题精选100题]58.八皇后问题
- 剑指Offer(java版)-8皇后问题
- 面试题:八皇后问题(N皇后问题)
- 剑指offer面试题 圆圈中最后剩下的数字(约瑟夫环问题)
- 剑指Offer_面试题28.5_字符串的排列扩展_排列组合_八皇后问题
- [各种面试题] N皇后问题非递归版
- 《剑指Offer》面试题:约瑟夫环问题
- 剑指offer-面试题28_3 八皇后问题
- 由八皇后问题到n皇后的推广
- 八皇后问题程序
- IBM公司面试题(附答案)—病狗问题
- 对求解“皇后排列问题”的一个新解法!
- 使用C#求解N皇后问题。