Kattis八皇后运动

时间:2017-06-21 15:30:45

标签: python

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

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

效率不高或结构合理,但由于问题不应该要求速度,所以我并不在乎。

我正在做的是检查每个位置,如果有一个女王 - 我水平,垂直和对角检查。我认为这可能是对角线检查代码错了,因为其他2个非常简单,但我无法弄明白......

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

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

1 个答案:

答案 0 :(得分:0)

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