回溯法—八皇后问题(N皇后)
2017-09-27 14:19
169 查看
八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。解题思路:
1.在8*8的棋盘上进行逐行试探,每一行进行逐格试探,判断该格是否能放一个皇后,即判断在该格对应的列,左斜线,右斜线上是否有皇后,若有则放,若无,则试探该行的下一个格子。
2.当该行已经放了皇后之后,跳到下一行;
若该行无法放入皇后,则说明之前放皇后的一行,皇后放的有问题,需要重新放,回退到该行放皇后的格子处,对后面的格子进行重新试探;依次类推,直到8行放完后,输出;
#include<iostream> using namespace std; int leftt[15]={0};//leftt控制左斜线 int rightt[15]={0};//rightt控制右斜线 int col[8]={0};//判断该列是否有皇后 int Q[8]={0};//下标代表皇后,值代表列号 int cnt=1;//计算当前为第几组解 void print(){ cout<<"第"<<cnt++<<"组解"<<endl; for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ if(Q[i]==j) cout<< 9ee5 ;"Q "; else cout<<"X "; } cout<<endl; } } void Queen(int i){//传入行号 if(i==8){ print();//当i为8时,说明棋盘已经被放满 } else{ for(int j=0;j<8;j++){//依次遍历当前行的每一个格子 if(!col[j]&&!leftt[i+j]&&!rightt[7+i-j]){//若该格子可以放皇后,则将值改1 col[j]=leftt[i+j]=rightt[7+i-j]=1; Q[i]=j;//将皇后的位置存入 Queen(i+1);//再给下一行放 col[j]=leftt[i+j]=rightt[7+i-j]=0;//从上一行退出来后,这说明这一行的皇后的位置不对,故抹去皇后的位置 } } } } int main(void){ Queen(0); return 0; }
就写这么多,如果那里不清楚联系我QQ294177133
相关文章推荐
- 【蓝桥杯-递归回溯】八皇后问题+N皇后问题
- 【算法分析】回溯法解八皇后问题(n皇后问题)
- 八皇后问题、N皇后问题回溯法详解
- HDU 2553 N皇后问题 (DFS_回溯)
- 回溯算法————n皇后、素数串
- 八皇后问题(递归+回溯)
- 回溯算法:八皇后问题
- leetCode 51. N-Queens | 回溯问题(N皇后问题) | hard
- 回溯法解决八皇后问题(循环/递归)
- 递归与回溯 HDOJ 2553 N皇后问题 1016 Prime Ring Problem
- N皇后问题(递归回溯的学习)
- 暴力枚举之八皇后问题(可行解个数,打印可行解纵坐标,棋盘有洞,n皇后)
- 递归回溯--八皇后问题
- 国际象棋“皇后”问题的回溯算法
- 递归回溯问题的四道经典题:N皇后,组合,全排列,二叉树路径和
- 回溯法.N皇后问题
- N 皇后问题 回溯/深搜
- [poj百练]2754:八皇后 回溯
- 八皇后问题及其扩展N皇后问题(经典回溯算法)
- uva-167 - The Sultan's Successors-八皇后-回溯