美文网首页
2019-02-23 N皇后算法

2019-02-23 N皇后算法

作者: sheep9159 | 来源:发表于2019-02-23 15:37 被阅读0次

C++实现N皇后问题

程序中一开始通过设置sizeOfBoard规定方形棋盘的大小

程序使用了vector类创建了一个大小可变的二维数组,chessBoard.size()就是sizeOfBoard
其实这就好像时钟的秒,分,时针一样,秒针转一圈,分针走一格,同理,分针走完一圈,时针走一格,不断的把所有可能都遍历完
#include<iostream>
#include<vector>

using namespace std;

int times = 0;

void put_Chess(int x, vector<vector<int>>& chessBoard);
bool check_Pos_Valid(int x, int y, vector<vector<int>>& chessBoard);
void print_Board(vector<vector<int>>& chessBoard);

int main(void)
{
    int sizeOfBoard;
    cout << "enter the size of board ( 1 or >= 4 ) : " << endl;
    cin >> sizeOfBoard;
    if (sizeOfBoard == 1 || sizeOfBoard >= 4)
    {
        vector<vector<int>> eightQueen(sizeOfBoard, vector<int>(sizeOfBoard));
        put_Chess(0, eightQueen);
        cout << "times = " << times << endl;
    }
    else
        cout << "only size of board is 1 or bigger than 4 has solution" << endl;
    return 0;
}

void put_Chess(int x, vector<vector<int>>& chessBoard)
{
    for (int col = 0; col < chessBoard.size(); col++)
    {
        if ((x >= 0 && x < chessBoard.size()) && check_Pos_Valid(x, col, chessBoard))
        {
            chessBoard[x][col] = 1;
            put_Chess(x + 1, chessBoard);
        }
        else if (x < 0 || x >= chessBoard.size())
        {
            times++;
            print_Board(chessBoard);
            break;
        }
    }
    if (x != 0)   //防止回溯到第一行最后一列结束时意外给内存中不属于数组的部分赋值
    {
        for (int i = x - 1; i < chessBoard.size(); i++)
        {
            for (int j = 0; j < chessBoard.size(); j++)
            {
                chessBoard[i][j] = 0;
            }
        }
    }
}

/*检查所选位置是否可放置皇后,是返回true,否返回false*/
bool check_Pos_Valid(int x, int y, vector<vector<int>>& chessBoard)
{
    /*检查所选位置的行是否已放置了皇后*/
    for (int i = 0; i < chessBoard.size(); i++)
    {
        if (chessBoard[x][i] == 1)
            return false;
    }
    /*检查所选位置的列是否已放置了皇后*/
    for (int j = 0; j < chessBoard.size(); j++)
    {
        if (chessBoard[j][y] == 1)
            return false;
    }
    /*检查所选位置的左上角是否已放置了皇后*/
    for (int i = 0, j = 0; i < chessBoard.size(); i++, j++)
    {
        if ((x - i >= 0) && (y - j >= 0) && chessBoard[x - i][y - j] == 1) 
            return false;
    }
    /*检查所选位置的右上角是否已放置了皇后*/
    for (int i = 0, j = 0; i < chessBoard.size(); i++, j++)
    {
        if ((x - i >= 0) && (y + j < chessBoard.size()) && chessBoard[x - i][y + j] == 1) 
            return false;
    }
    /*检查所选位置的左下角是否已放置了皇后*/
    for (int i = 0, j = 0; i < chessBoard.size(); i++, j++)
    {
        if ((x + i < chessBoard.size()) && (y - j >= 0) && chessBoard[x + i][y - j] == 1) 
            return false;
    }
    /*检查所选位置的右下角是否已放置了皇后*/
    for (int i = 0, j = 0; i < chessBoard.size(); i++, j++)
    {
        if ((x + i < chessBoard.size()) && (y + j < chessBoard.size()) && chessBoard[x + i][y + j] == 1) 
            return false;
    }
    return true;
}

void print_Board(vector<vector<int>>& chessBoard)
{
    cout << "------------------------" << endl;
    for (int i = 0; i < chessBoard.size(); i++)
    {
        for (int j = 0; j < chessBoard.size(); j++)
        {
            cout << chessBoard[i][j] << " ";
        }
        cout << endl;
    }
    cout << "------------------------" << endl;
}

相关文章

  • 2019-02-23 N皇后算法

    C++实现N皇后问题 程序中一开始通过设置sizeOfBoard规定方形棋盘的大小 程序使用了vector类创建了...

  • 第16章 抽象深度优先搜索

    1、2n皇后问题 算法分析 与n皇后问题类似,如下是n皇后问题的分析,时间复杂度 按行继续比遍历,其中col[x]...

  • 每日一题:n queues

    题目:在n阶棋盘上放n个皇后,皇后在横竖斜都不能重复。分析:这是一道典型的回溯算法算法:1>如果当前的格子是可以放...

  • Python N皇后算法

    递归法 用一个一维N元数组来存放每一行皇后的位置,这样就不存在行冲突了,只要判断哪一列可以放置就可以了,如果找到一...

  • 面试题 08.12. N皇后问题 - Kotlin 解法

    设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的...

  • 回溯算法之八皇后问题

    问题描述 设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线...

  • 算法笔记_07: 蓝桥杯练习 王、后传说

    引用 算法训练 王、后传说.大神用数组,用的出神入化啊。 8皇后以及N皇后算法探究 1. 问题描述 地球人都知道...

  • 算法(11):回溯法

    今天补一下回溯法,别的不说,n皇后问题必须列出来才行~ 目录:算法:附录算法(1):递归算法(2):链表算法(3)...

  • 算法02:N 皇后问题

    描述 整数 N 个皇后放在 N * N 的棋盘上,要求每个皇后不能相互攻击,即同一行、同一列、同一斜线上不能同时存...

  • 回溯算法 - N皇后问题

    回溯算法 实际上就是一个决策树的遍历过程 路径:已经做出的选择 选择列表:是你当前可以做的选择 结束条件:到达决策...

网友评论

      本文标题:2019-02-23 N皇后算法

      本文链接:https://www.haomeiwen.com/subject/xpdpyqtx.html