2017-05-20 3 views
0

私は自分のコードの断片を持っています。私は、クイーンの配置の行、列、対角線をチェックしてお互いを攻撃しないようにする関数を書いています。現在、私は、斜めの機能の問題を抱えている:nqueenで斜めに確認する

def checkDiagonal(T): 
for i in range(len(T) - 1): 
    if abs(T[i] - T[i + 1]) == 1: 
     return False 
return True 

この機能の問題は、女王は長さ離れてではなく、1以上の場合より一つであるとき、それが唯一検討するということです。

例、N = 7が出力した場合:

Enter the value of N: 7 
0 Q 0 0 0 0 0 
0 0 0 0 0 0 0 
0 0 X 0 0 0 0 
0 0 X 0 0 0 0 
0 0 X 0 0 0 0 
0 0 X 0 0 0 0 
Q 0 0 0 0 0 0 

出力Q iがコードに設定された部分の溶液です。 Xはクイーンの次の可能な位置ですが、出力にはクイーンとはっきりと対角線上に1つのXがあり、攻撃されます。場合にのみ場合>右上対角線 - T

+0

入力パラメータ「T」とは何ですか? – JohanL

+0

@JohanL部分解リスト[6,0] – Electric

+0

あなたはどのような 'X 'ポジションをテストしているのですか?または、それらをすべてテストしたいですか?その場合、「N」は持っていると良いでしょう。 – JohanL

答えて

0

よう= [6,0]、この場合には、関数に渡される

部分解リストを2点(x1, y1)(x2, y2)一の同じ左下ありますy1 - x1 == y2 - x2。 あなたが正しく質問していると分かっている場合、部分解T = [0,6]は部分解[(0,0), (1,6)]を表します。したがって、0 - 0 = 0 != 5 == 6 - 1以降、これらの2つの要素は同じ対角にありません。

ただし、部分解については、となります。0 - 0 == 0 == 2 - 2となり、2つの点は同じ左下 - >右上の対角になります。

左上 - >右下の対角線については、同様の状態を見つけなければなりません。これは把握できるはずですが、見つけられない場合は教えてください。

これは(これだけ対角線のための)コードのようなものにつながる

def checkDiagonal(T): 
    for i in xrange(len(T) - 1): 
     for j in xrange(i + 1, len(T)) 
      if ((T[i] - i == T[j] - j): 
       return false 
    return true 

が、私はこれをテストする時間がなかったので、それにわずかな誤差があるかもしれないことしかし注意してください、しかし、一般的な考え方は正しいはずです。

関連する問題