八皇后问题——回溯
Posted 会飞的咸鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后问题——回溯相关的知识,希望对你有一定的参考价值。
经典八皇后问题参考博客http://blog.csdn.net/mbh_1991/article/details/23869459
下面解决八皇后的改版问题:
AC代码:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 char board[10][10]; 6 int board2[10][10]; 7 int num=0; //记录八皇后的个数 8 int res=0; 9 int dir[3][2]={{-1,-1},{-1,1},{-1,0}}; //检测三个方向,左上,右上,正上(对一排来说,从上往下放置只看上一层的情况) 10 11 void init(){ //初始化 12 for(int i=1;i<=8;i++){ 13 for(int j=1;j<=8;j++){ 14 board[i][j]=\'.\'; 15 cin>>board2[i][j]; 16 } 17 } 18 } 19 20 bool check(int i,int j){ //行和列 21 bool flag=true; 22 for(int p=0;p<3;p++){ 23 int ni=i; 24 int nj=j; 25 while(flag&&(ni>=1)&&(ni<=8)&&(nj>=1)&&(nj<=8)){//判断是否到棋盘边界 26 ni+=dir[p][0]; 27 nj+=dir[p][1]; 28 flag=flag&&(board[ni][nj]!=\'*\'); //判断这个方向没有放过皇后 29 } 30 } 31 return flag; 32 } 33 34 void allMax(){ //查找最大值 35 int sum=0; 36 for(int i=1;i<=8;i++){ 37 for(int j=1;j<=8;j++){ 38 if(board[i][j]==\'*\'){ 39 sum+=board2[i][j]; 40 } 41 } 42 } 43 if(sum>res){ 44 res=sum; 45 } 46 } 47 48 void dfs(int i){ 49 if(i>8){ //判断是否超过了八行 50 allMax(); 51 num++; 52 }else{ 53 for(int j=1;j<=8;j++){ //判断一行是否有匹配的位置 54 if(check(i,j)){ 55 board[i][j]=\'*\'; //放置皇后 56 dfs(i+1); 57 board[i][j]=\'.\'; //清除放错的皇后 58 } 59 } 60 } 61 } 62 63 int main(){ 64 init(); 65 dfs(1); 66 cout<<res<<endl; 67 return 0; 68 }
以上是关于八皇后问题——回溯的主要内容,如果未能解决你的问题,请参考以下文章