对于八皇后问题,我自己想出一种解法,不知道是不是可能会跟别人一样,如有雷同,当引为知己.........
八皇后问题:在国际棋盘上(8×8),放置八个皇后,使得八个皇后不能相互被吃掉。皇后可以横着,竖着,斜向走......
求有几种摆法。
我看过别人的思路大体是,判断皇后放置后会不会被吃掉,即判断一个位置是否合法。(这种方法没有实践过,不知道2种方法那种更简单,也有可能是我想复杂了)
我的思路是不断更新棋盘状态,只走合法路线。
首先,将棋盘状态初始化为0。然后从第一个点开始,一排一排的进行深搜,每找到一个合法的点就更新棋盘的状态。若遇到死胡同,则退回上一级状态。
上传一部分运行过程。每一次更新,棋盘状态都是不一样的,结果是累加flag的当前值,而每次更新时flag自身的值又会+1
</pre><pre name="code" class="cpp">#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <string>
using namespace std;
int board[9][9];
int count = 0; ///解法数
int flag = 0; ///用来表示棋盘状态的参数
int zhanshi(){ ///打印board当前状态。调试时使用。
for(int i = 1; i <= 8; ++i){
for(int j = 1; j <= 8; ++j){
printf("%d ",board[i][j]);
}
printf("\n");
}
printf("*******************************\n");
return 0;
}
void zhiyi(int x,int y){ ///表示以(x,y)点的横向、竖向、斜向不能被选(!=0),四个方向分别是某点的 右方、右下、下方、左下
int tmp1 = ++flag; ///因为我们是自上往下搜,所以,其他方向可以不考虑
for(int i = x; i <= 8; ++i) board[i][y] += tmp1;
for(int i = y + 1; i <= 8; ++i) board[x][i] += tmp1;
for(int i = 1; (x+i) <= 8 && (y+i) <= 8; ++i)
board[x+i][y+i] += tmp1;
for(int i = 1; (x+i) <= 8 && (y-i) >= 1; ++i)
board[x+i][y-i] += tmp1;
}
void zhiling(int x,int y){ ///回溯。表示回到上一级的状态,按照zhiyi函数的方向倒退
int tmp2 = flag;
for(int i = x; i <= 8; ++i) board[i][y] -= tmp2;
for(int i = y + 1; i <= 8; ++i) board[x][i] -= tmp2;
for(int i = 1; (x+i) <= 8 && (y+i) <= 8; ++i)
board[x+i][y+i] -= tmp2;
for(int i = 1; (x+i) <= 8 && (y-i) >= 1; ++i)
board[x+i][y-i] -= tmp2;
flag--;
}
int dfs(int x,int y){ ///深搜。一排一排的进行深搜
if(x == 8){
count++;
return 0;
}
zhiyi(x,y);
for(int i = 1; i <= 8; ++i){
if(board[x+1][i] == 0)
dfs(x+1,i);
}
zhiling(x,y);
return 0;
}
int main()
{
memset(board,0,sizeof(board));
for(int i = 1; i <= 8; ++i) dfs(1,i);
printf("%d\n",count); ///可行解的数量
return 0;
}