检查N-queens

时间:2016-03-30 02:21:39

标签: python loops python-3.x

diagonal_conflict(board, r, c)

给定一个板和两个整数表示行/列位置, 确定女王是否已经与坐标(r,c)放在同一对角线上;把答案作为回答 布尔值。

实施例

  

o diagonal_conflict([[True,False],[False,False]],1,1)→True

     

o diagonal_conflict([[True,False],[False,False]],1,0)→False

我已经弄明白这三件事

  
      
  1. 从r和c中减去1,直到你越界,r或c击中负数

  2.   
  3. 向r和c添加1,直到您越界。这是len(董事会)

  4.   
  5. 将1加到r中,从c中减去1(这是为了让对角线朝另一个方向移动)

  6.   

但不知道如何开始为它编写代码。我知道上面每个都需要3个循环。 我最好的是

def conflict(board,r,c):
      for (r,c) in board
          if r+1==r and...

很明白这是错误的,有人可以把我的想法变成python代码吗?

3 个答案:

答案 0 :(得分:2)

你走了。我是为你而做的;)

def diagonal_conflict(board, r, c):
    for r_add, c_add in ((-1, -1), (1, 1), (-1, 1), (1, -1)):
        current_r = r
        current_c = c
        while 0 <= current_r < len(board) and 0 <= current_c < len(board[0]):
            if board[current_r][current_c]:
                return True
            current_r += r_add
            current_c += c_add
     return False

另一个由@abhaybhatia创建的逻辑解决方案现在转换为Python:

def diagonal_conflict(board, r, c):
    for i in range(len(board)):
        for j in range(len(board[i])):
            if board[i][j] and (float(c-j)/(r-i) in (1, -1)):
                return True
    return False

答案 1 :(得分:0)

你有正确的想法。有人说,如果你会说英语,你可以写Python。为了给你一个提示,如果你重写了问题中使用这个词直到的每个句子,以便在时使用这个词,该怎么办?

例如,

  

从r和c中减去1,直到你超出界限,这时r或c命中负数

可以改写为

  

虽然r和c不是负数,但从r中减去1并从c中减去1

然后Python显而易见:

while r >= 0 and c >= 0:
    # check for a queen
    r -= 1
    c -= 1

答案 2 :(得分:0)

你可以让女王在4个方向上

  1. r和c减少
  2. r降低c增加
  3. r增加c减少
  4. r和c增加
  5. 因此,如果您知道女王的位置,您应该检查r,c和女王坐标的斜率是1还是-1 - 然后它们在同一对角线上

    这里有一些python代码

    def diagonal_conflict(board, r, c):
        for i in range(len(board)):
            for j in range(len(board[i])):
                if board[i][j] and (float(c-j)/(r-i) in (1, -1)):
                    return True
        return False