zoukankan      html  css  js  c++  java
  • 通过C语言,利用递归回溯的方法,实现八皇后问题的求解

    八皇后问题:
    在国际象棋8*8的棋盘上,摆放八个皇后且皇后都无法吃掉对方,而八皇后的攻击路线
    为它所在的列和行,还有45度斜线.

    对于该问题,首先要确定递归的输入和输出,以及终止条件和方法。一个递归完成对当
    前行皇后位置的确定,并通过遍历所有列,查找出所有可能。其中,利用对列的遍历实
    现回溯。

    具体实现方法,可以通过代码理解,以及思路参考https://blog.csdn.net/a304672343/article/details/8029122
    参考博客的博主对于八皇后位置的表示处理的很好,非常有借鉴意义

    //[数据结构]:八皇后=
    //[递归],[回溯]

    include <stdio.h>

    include <stdbool.h>

    include <stdlib.h>

    define n 8 //确定八皇后的阶数

    int queen[n]; //每行对应的皇后位置 queen[行数row] = 列数col
    int num = 0; //计算可能出现的正确方式次数

    //判断当前行,皇后位置是否合理
    bool isqueen(int row)
    {
    for(int i=0;i<row;i++)//依次将当前行皇后位置与已放行皇后位置进行比较
    {
    if(abs(row-i) == abs(queen[row]-queen[i]) || queen[row] == queen[i])
    //此处用意:确定当前行皇后位置是否与已放行皇后位置存在冲突(对角线 || 同一列)
    {
    return false;
    }
    }
    return true;
    }

    //求解函数
    void eightqueen(int row)
    {
    for(int col=0;col<n;col++) //依次摆放的列,遍历,回溯
    {
    queen[row] = col; //
    if(isqueen(row)) //
    {
    if(row == n-1) //最后一列,递归终止条件
    {
    num++; //可能情况
    printf("第%d种:",num);
    for(int i=0;i<n;i++) printf("(%d,%d) ",i,queen[i]);
    printf(" ");
    }
    else eightqueen(row + 1); //下一行
    }
    }
    }

    int main()
    {
    printf("welcome to eightqueen's question 表示方法:(行数,当前行皇后所在列数) ");
    eightqueen(0);//调用求解函数,负责打印结果
    }

  • 相关阅读:
    Windows上安装PyV8
    Windows鼠标右键菜单添加SublimeText打开选项
    Windows使用Python虚拟环境
    Windows同时安装Python2和Python3
    Windows使用Cmder
    Visual Studio Code配置
    Windows 10使用Tesseract-OCR出现WindowsError: [Error 2]
    用pymysql代替MySQLdb
    使用python来搞定redis的订阅功能
    来写一个最基本的装饰器吧!
  • 原文地址:https://www.cnblogs.com/ZhongShengXueXi/p/9129501.html
Copyright © 2011-2022 走看看