八皇后问题----另类解法

对于八皇后问题,我自己想出一种解法,不知道是不是可能会跟别人一样,如有雷同,当引为知己………

八皇后问题:在国际棋盘上(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;
}


    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/shengsikandan/article/details/50822057
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞