【问题标题】:Kattis Eight Queens exercise卡蒂斯八皇后运动
【发布时间】:2017-11-24 14:41:44
【问题描述】:

在 Python 中尝试八皇后问题 (https://open.kattis.com/problems/8queens)。

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

它不是很有效,也不是很好的结构,但由于问题不应该要求速度,所以我并不在意。

我正在做的是检查每个位置,如果那里有皇后 - 我会检查水平、垂直和对角线。我认为可能是对角线检查代码错误,因为其他两个非常简单,但我无法弄清楚...

编辑:请求粘贴有问题的代码,不明白为什么但确定:

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

Edit3:修复了最后一个错误,代码现在可以工作了!

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")

【问题讨论】:

  • 请将代码粘贴到问题中,不要粘贴到其他网站。
  • 有什么问题?您是否要求我们对您的项目进行代码审查并找出它不工作的原因?
  • 所有样本输入都通过了吗?
  • @RPGillespie 样本正在通过,以及我能想象到的所有其他测试。问题是:你能看出任何明显的缺陷吗?你能想象一个我的代码崩溃的测试用例吗?

标签: python


【解决方案1】:

您没有检查以确保棋盘上正好有 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

【讨论】:

  • 哦,哈哈,甚至没有意识到这是一个要求,他们的措辞很糟糕。谢谢伙计!
  • @Krilliminell 如果valid 而不是counter == 8 会发生什么?您的程序是否只是终止而不打印任何内容?
  • 是的哈哈刚刚看到,现在修复它!这个网站上的downvotes是怎么回事?为什么人们会否决一个随机问题?我应该以不同的方式发布吗?
  • @Krilliminell 不要亲自投票。 “查找我的错误”问题不受欢迎,因为它们一次只能帮助一个人。 StackOverflow 的目标是创建一组有益于多人的问题。由于几个原因,您被否决了 - (1) 这是一个“家庭作业帮助”/“找到我的错误”类型的帖子,只会让您受益,(2) 您已经粘贴了大量代码,而理想情况下您应该只粘贴一个包含问题的小sn-p。不要把它当作个人 - 只需在下一个问题上尝试更好,并自己回答几个问题来回馈社区!
  • 我完全同意你对他们没有正确指定问题的看法。对我来说,一个少于 8 个皇后的棋盘并不是 8 个皇后问题的无效解决方案,而是一个无效的输入。这就像要求我们确保每行不是 9 个字符而不是 8 个字符,或者所有空格都用点而不是逗号表示。这些东西与解决方案无关,只是输入错误。
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多