python关于八皇后判断冲突函数的一些逻辑小问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python关于八皇后判断冲突函数的一些逻辑小问题相关的知识,希望对你有一定的参考价值。

函数代码如下:
def ct(stage,nextx):
....nexty=len(stage)
....for i in range(nexty):
........if abs(stage[i]-nextx) in (0,nexty-i):
............return True
........else:
............return Flase
这段代码是从书上照搬的,检测八皇后冲突的函数,函数形参stage是一个元组,代表已知棋子的横坐标(比如(1,3,0)代表第一个棋子在第一行第二列,第二个棋子在第二行,第四列。),其元组中的位置就是纵坐标比如stage[0]=1就代表第一个棋子在第一行的第二列。形参nextx代表的是要测试的棋子的横坐标。而其中变量nexty代表测试棋子的纵坐标。
主要的疑问集中在判断语句if abs(stage[i]-nextx) in (0,nexty-i)上面:stage[i]-nextx这个结果是前一个棋子的横坐标减去当前棋子的横坐标,如果等于0也就是说明在一列,冲突,没有问题,架设这个得到值是a值。而nexty-i是比较对角线架设这个值为b值,我的理解就是第i个棋子的对角线。我不明白的是为啥这两个值相减,也就是测试棋子的纵坐标减去i,就可以得到i棋子的对角线。还有就是为啥用a值去与b值比较,而不用nextx去与b值比较。

代码确实不对false的返回位置不对,另外你的问题答案是在一条对角线说明两点连接的斜率为1或负1,也就是横坐标相减的绝对值等于纵坐标相减 参考技术A 不清楚这个函数是如何被调用的。
看完这段程序,疑惑的有2点:
1. if 和 else两个 return, 导致了for循环一定是只能执行一次,就必然有一个return,所以循环没法执行下去
2. 从if else的判断上,感觉含义是如果return是True的时候说明该点不可用。

经过测试,这段代码应该是错的。。。啥书啊?

八皇后问题(递归方法详解)

八皇后递归详解

核心代码如下:

技术分享图片
//八皇后递归解法
#include<iostream>
using namespace std;

int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
int count = 0;//定义一个全局变量
bool available(int pointi,int pointj) //判断某个皇后是否与已有皇后冲突
{
    for(int i = 1; i<pointi; i++)
    {
        if(pointj == queen[i])
            return false;//同一列拒绝
        if((pointi-i) == (pointj-queen[i]))
            return false;//同一主对角线拒绝
        if((pointi-i) + (pointj-queen[i]) == 0)
            return false;//同一副对角线拒绝
    }
    return true;
}
void findSpace(int queenNumber) //在第queenNumber行找能放皇后的位置
{
//因为行数在递归中不断调用(即行数在递归一次取下一行),所以只要遍历列的位置
    for(int i = 1; i<9; i++) //从1~8遍历这一行的八个空位
    {
        if(available(queenNumber,i))
        {
//如果可以放这个位置就记录下第queenNumber个皇后的位置
            queen[queenNumber] = i;
            if(queenNumber == 8) //如果八个皇后都放满了统计一下
            {
                count++;//次数就增加一次
                return;
            }
            int nextNumber = queenNumber+1;//还有皇后没放递归放下一个皇后(取下一行)
            findSpace(nextNumber);//递归
        }
    }
    queen[--queenNumber] = -1;//如果这一行没有可放的位置说明上一行皇后放的位置不行,要为上一个皇后寻找新的可放位置(即就要重新再找一次)
    return;
}
int main()
{
    findSpace(1);//从(1,1)开始递归好理解
    cout << count << endl;
    return 0;
}
View Code

八皇后问题可以不只是限制于八个皇后,可以推广到n皇后问题,下期介绍。

技术分享图片
//八皇后递归解法(C语言写法)

//#include<iostream>
//using namespace std;
#include<stdio.h>

int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
int count = 0;//定义一个全局变量
bool available(int pointi,int pointj) //判断某个皇后是否与已有皇后冲突
{
    for(int i = 1; i<pointi; i++)
    {
        if(pointj == queen[i])
            return false;//同一列拒绝
        if((pointi-i) == (pointj-queen[i]))
            return false;//同一主对角线拒绝
        if((pointi-i) + (pointj-queen[i]) == 0)
            return false;//同一副对角线拒绝
    }
    return true;
}
void findSpace(int queenNumber) //在第queenNumber行找能放皇后的位置
{
//因为行数在递归中不断调用(即行数在递归一次取下一行),所以只要遍历列的位置
    for(int i = 1; i<9; i++) //从1~8遍历这一行的八个空位
    {
        if(available(queenNumber,i))
        {
//如果可以放这个位置就记录下第queenNumber个皇后的位置
            queen[queenNumber] = i;
            if(queenNumber == 8) //如果八个皇后都放满了统计一下
            {
                count++;//次数就增加一次
                return;
            }
            int nextNumber = queenNumber+1;//还有皇后没放递归放下一个皇后(取下一行)
            findSpace(nextNumber);//递归
        }
    }
    queen[--queenNumber] = -1;//如果这一行没有可放的位置说明上一行皇后放的位置不行,要为上一个皇后寻找新的可放位置(即就要重新再找一次)
    return;
}
int main()
{
    findSpace(1);//从(1,1)开始递归好理解
    //cout << count << endl;
    printf("%d
",count);
    return 0;
}
C写法

 

以上是关于python关于八皇后判断冲突函数的一些逻辑小问题的主要内容,如果未能解决你的问题,请参考以下文章

八皇后问题(递归方法详解)

python 逻辑推理编程解决八皇后

小白有一个关于python递归的问题 求教

python学习八皇后问题

python基础查漏补缺7--八皇后问题

八皇后问题Python实现