Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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 - Fatal编程技术网

Python 卡蒂斯八皇后运动

Python 卡蒂斯八皇后运动,python,Python,正在尝试Python()中的八皇后问题 我已经编写了一些代码,这些代码适用于我在过去一个小时所能想象的所有输入,但该程序仍然无法通过Kattis测试用例 这不是很有效率,也不是很有条理,但既然问题不需要速度,我就不在乎了 我所做的是检查每个位置,如果有一个女王在那里-我检查水平,垂直,和对角线。我想可能是对角线检查代码错了,因为另外两个代码非常简单,但我无法理解 编辑:请求粘贴有问题的代码,不了解原因,但确定: Edit2:通过添加计数器来编辑代码,以确保有8个皇后 Edit3:修复了上一个bu

正在尝试Python()中的八皇后问题

我已经编写了一些代码,这些代码适用于我在过去一个小时所能想象的所有输入,但该程序仍然无法通过Kattis测试用例

这不是很有效率,也不是很有条理,但既然问题不需要速度,我就不在乎了

我所做的是检查每个位置,如果有一个女王在那里-我检查水平,垂直,和对角线。我想可能是对角线检查代码错了,因为另外两个代码非常简单,但我无法理解

编辑:请求粘贴有问题的代码,不了解原因,但确定:

Edit2:通过添加计数器来编辑代码,以确保有8个皇后

Edit3:修复了上一个bug,代码现在可以运行了

import sys
import math

def horizontal(j, row):
    for k in range(8):
        if k == j:
            continue
        if row[k] == '*':
            return False
    return True

def vertical(rows, row , column):
    for i in range(8):
        if i == row:
            continue
        if rows[i][column] == '*':
            return False
    return True

def diagonal(rows, row, column):
    #first diagonal
    current_row = row
    current_col = column

    #go furthest up
    while True:
        if current_col == 0 or current_row == 0:
            break
        current_col-=1
        current_row-=1
    while True:
        if current_row == row and current_col == column:
            if current_col == 7 or current_row == 7:
                break
            current_col += 1
            current_row += 1
            continue
        if rows[current_row][current_col] == '*':
            return False
        if current_col == 7 or current_row == 7:
            break
        current_col += 1
        current_row += 1

    #other diagonal
    current_row = row
    current_col = column
    while True:
        if current_col == 7 or current_row == 0:
            break
        current_col+=1
        current_row-=1
    while True:
        if current_row == row and current_col == column:
            if current_col == 0 or current_row == 7:
                break
            current_col -= 1
            current_row += 1
            continue
        if rows[current_row][current_col] == '*':
            return False
        if current_col == 0 or current_row == 7:
            break
        current_col -= 1
        current_row += 1
    return True

rows = []
for i in range(8):
    rows.append(sys.stdin.readline().rstrip())

valid = True
counter = 0

#for every row:
for row in range(8):
    for column in range(8):
        if rows[row][column] == '*':
            counter += 1
            if not (horizontal(column,rows[row]) and vertical(rows, row, column) and diagonal(rows, row, column)):
                valid = False
                break

    if not valid:
        break
if valid and counter == 8:
    print("valid")
else:
    print("invalid")

你没有检查以确保棋盘上有8个皇后。传入一个空板,你的程序就会说它是有效的

num_queens = 0
for row in range(8):
    for column in range(8):
        if rows[row][column] == '*':
            num_queens += 1

...

if num_queens != 8:
    valid = False

请将代码粘贴到问题中,不要粘贴到其他网站。问题是什么?您是否要求我们对您的项目进行代码审查并找出其不起作用的原因?是否所有样本输入都通过了?请参阅:@RPGillespie样本通过了,以及我能想象到的所有其他测试。问题是:你能看到任何明显的缺陷吗?你能想象一个我的代码停止运行的测试用例吗?噢,lol甚至没有意识到这是一个要求,他们的措辞很糟糕。。谢谢你,伙计@Krilliminell如果
有效
但不是
计数器==8
,会发生什么情况?你的程序只是在不打印任何内容的情况下终止吗?是的,哈哈,刚才看到了,现在就修复了!这个网站的否决票是怎么回事?为什么人们对一个随机的问题投反对票?我应该换一种方式发布吗?@Krilliminell不会把落选票放在个人身上。“查找我的bug”问题是不受欢迎的,因为它们一次只能帮助一个人。StackOverflow的目标是创建一个有利于多人的问题集合。由于以下几个原因,您获得了否决票—(1)这是一篇“家庭作业帮助”/“查找我的bug”类型的帖子,只对您有利,(2)您粘贴了大量代码,而理想情况下,您应该只粘贴一个包含问题的小片段。不要把它看成是个人问题——只是在下一个问题上做得更好,自己回答几个问题,以回馈社区!我完全同意你的看法,他们没有恰当地说明这个问题。对我来说,一个少于8个皇后的电路板并不是解决8个皇后问题的无效方案,它是一个无效的输入。这就像要求我们确保每行没有9个字符而不是8个,或者所有空格都用点而不是逗号表示。这些东西与解决方案无关,只是输入错误。