Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在国际象棋比赛中猜皇后的位置_Python_Python 3.x_Chess_N Queens_Python Chess - Fatal编程技术网

Python 如何在国际象棋比赛中猜皇后的位置

Python 如何在国际象棋比赛中猜皇后的位置,python,python-3.x,chess,n-queens,python-chess,Python,Python 3.x,Chess,N Queens,Python Chess,我最近参加了一个编程比赛,我能及时回答七个问题中的六个。最后一个问题是:从用户那里取一个数字,根据给定的数字的力量制作一个棋盘,放置尽可能多的皇后,并以一种方式排列皇后,使它们不会在水平、垂直和对角方向上相互威胁。例如,如果用户输入4,则4x416国际象棋棋盘中会有4个皇后。对于垂直和水平部分,我能够检查它们是否在同一列中,对于对角线部分,我使用了非常糟糕的while循环组合,然后将国际象棋游戏中所有保留的位置添加到列表中。问题是,我使用随机模块生成索引,然后检查它们是否在保留的数字中,然后重试

我最近参加了一个编程比赛,我能及时回答七个问题中的六个。最后一个问题是:从用户那里取一个数字,根据给定的数字的力量制作一个棋盘,放置尽可能多的皇后,并以一种方式排列皇后,使它们不会在水平、垂直和对角方向上相互威胁。例如,如果用户输入4,则4x416国际象棋棋盘中会有4个皇后。对于垂直和水平部分,我能够检查它们是否在同一列中,对于对角线部分,我使用了非常糟糕的while循环组合,然后将国际象棋游戏中所有保留的位置添加到列表中。问题是,我使用随机模块生成索引,然后检查它们是否在保留的数字中,然后重试,直到它不在那里。因此,发生的情况是,这个国际象棋游戏只有几个组合,如果开始的索引错误,程序几乎永远卡在while循环中。我曾想过从最后一行到第一行,但即使如此,我仍然使用随机索引。我怎样才能让程序计算皇后区的位置,而不是仅仅随机地输入一个数字,然后看看它是否有效?我的代码:如果我的代码有其他错误,请指出:


这是一个相当著名的难题,被称为N皇后问题。这是一般的情况

有几个,包括这个非常优雅的:

从itertools导入置换 n=8 科尔斯=兰根 对于置换SCOL中的vec: 如果n==lensetvec[i]+i表示cols中的i\ ==lensetvec[i]-i表示cols中的i: 打印向量 :

对于表示为每行有一个皇后的向量的解决方案,我们不必检查两个皇后是否在同一行上。通过使用置换生成器,我们知道向量中没有重复的值,因此我们不必检查两个皇后是否在同一列上。由于车的移动不需要检查,我们只需要检查主教的移动

检查对角线的技术是从每个条目中加上或减去列号,因此同一对角线上的任何两个条目将具有相同的值。换句话说,每个对角线的和或差是唯一的。现在我们要做的就是确保八个皇后的对角线是不同的。因此,我们将它们放在一个集合中,以消除重复项,并检查集合长度是否为8,是否删除了重复项

任何对角线不重叠的置换都是一个解。所以,我们打印它并继续检查其他排列


这是一个相当著名的难题,被称为N皇后问题。这是一般的情况

有几个,包括这个非常优雅的:

从itertools导入置换 n=8 科尔斯=兰根 对于置换SCOL中的vec: 如果n==lensetvec[i]+i表示cols中的i\ ==lensetvec[i]-i表示cols中的i: 打印向量 :

对于表示为每行有一个皇后的向量的解决方案,我们不必检查两个皇后是否在同一行上。通过使用置换生成器,我们知道向量中没有重复的值,因此我们不必检查两个皇后是否在同一列上。由于车的移动不需要检查,我们只需要检查主教的移动

检查对角线的技术是从每个条目中加上或减去列号,因此同一对角线上的任何两个条目将具有相同的值。换句话说,每个对角线的和或差是唯一的。现在我们要做的就是确保八个皇后的对角线是不同的。因此,我们将它们放在一个集合中,以消除重复项,并检查集合长度是否为8,是否删除了重复项

任何对角线不重叠的置换都是一个解。所以,我们打印它并继续检查其他排列


这是一个巧妙的解决方案!谢谢@RichardTowers引用它。哇!这是如此的干净和简单!非常感谢!这是一个巧妙的解决方案!谢谢@RichardTowers引用它。哇!这是如此的干净和简单!非常感谢!
import random

# in the program you had to put '1' as the position of the queens and put '0' as the empty places on the board
# and also, if the user entered a number less than 4 the combination would not have been possible

num = int(input("Enter number: "))
if num >= 4:
    arr = [[0 for _ in range(num)] for _ in range(num)]
    reserved_num = []
    oblique = []
    for i in range(num):
        j = random.randint(0, num - 1)
        while [i, j] in reserved_num:
            j = random.randint(0, num - 1)
        arr[i][j] = 1
        for rows in range(num):
            reserved_num.append([rows, j])
        if i < num-1:
            inc = 0
            if j == num-1:
                while j-inc > 0 and i+inc < num-1:
                    inc += 1
                    oblique.append([i+inc, j-inc])
                else:
                    inc = 0
            elif j == 0:
                while j+inc < num-1 and i+inc < num-1:
                    inc+= 1
                    oblique.append([i+inc, j+inc])
                else:
                    inc = 0
            else:
                while j+inc < num-1 and i+inc < num-1:
                    inc+= 1
                    oblique.append([i+inc, j+inc])
                else:
                    inc = 0
                while j-inc > 0 and i+inc < num-1:
                    inc += 1
                    oblique.append([i+inc, j-inc])
                else:
                    inc = 0
        for res in oblique:
            reserved_num.append(res)

    for items in arr:
        print(items)
else:
    print("Not Possible! ")