尝试使用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")
答案 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