Python错误中的N皇后算法

时间:2017-09-26 14:00:29

标签: python

我是Python的新手,所以我只是想构建我已用C ++和Java构建的所有程序,只是为了熟悉语法。我在N queen问题中遇到了错误,它在C ++和Java中完美执行。

这是代码

def place(m , i):
    for j in range(0 , m - 1 ):
        if(x[j] == i or abs(x[j] - i) == abs(j-m)):
            return False
    return True

def nqueen(k , n ):
    for c in range(0, n):
        if( place(k , c) ):
            x[k] = c 
            if ( k == n):
                print(x)
            else:
                nqueen(k + 1 , n)

x = []
num = int(input("Enter the no. of rows and columns: "))
nqueen(0 , num)

num = 4的输出应为:

  • 2 4 1 3
  • 3 1 4 2

遇到的错误是:

  • 回溯(最近一次呼叫最后一次):

  • 文件“D:\ P \ NQueen.py”,第18行,in    nqueen(0,num)

  • 文件“D:\ P \ NQueen.py”,第10行,在nqueen中    x [k] = c IndexError:列表赋值索引超出范围

请帮帮我。

3 个答案:

答案 0 :(得分:0)

range(0,n)产生一个从零开始的列表,该列表上升到n-1。你的检查k == n需要是k ==(n-1)。否则你正在调用x [n],它比你想要的更大。另外,范围函数默认从0开始。您可以使用范围(m-1)和范围(n)获得与当前相同的结果。

答案 1 :(得分:0)

除非你已经分配了元素,否则Python不会让你访问元素。它允许您使用append / extend动态增长它,但要访问特定元素,您必须实际创建空间:

In [1]: x = []
In [2]: x[0]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-2-1ae75c28907a> in <module>()
----> 1 x[0]    
IndexError: list index out of range
In [3]: x[0] = 1
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-16-1a754504edbf> in <module>()
----> 1 x[0] = 1    
IndexError: list assignment index out of range
In [4]: x = [0] * 4   
In [5]: x[0]
Out[5]: 0 (0x0)
In [6]: x[0] = 1

(请注意,您也应该在C中执行此操作,但有时C会让您不安全地离开,不确定为什么Java会让您这样做)。

其他选项是使用append迭代:

x = []
for entry in some_list:
     x.append(processed_value(entry))

或者使用字典,它有其他缺点,但也可以用作稀疏数组。如果您想要默认读取功能,可以使用defaultdict:

In [8]: d1 = {}    
In [9]: d1[0] = 1    
In [10]: d2 = {}
In [11]: d2[0]
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-11-8d722d66aade> in <module>()
----> 1 d2[0]
KeyError: 0
In [12]: from collections import defaultdict
In [13]: d2 = defaultdict(int)
In [14]: d2[0]
Out[14]: 0 (0x0)

答案 2 :(得分:0)

要在python中初始化固定长度列表,您必须使用类似

的内容

x = [None] * numx = [0] * num

此外,range(0,n)0 to n-1开始迭代,因此在place函数中,您应该使用for j in range(0 , m )

除此之外,逻辑上你应该在打印结果列表之前检查if ( k == n-1)而不是if ( k == n)