python - 為什么在main()函數里result 會變成那樣?
問題描述
#Any Queens puzzledef share_diagonal(x0, y0, x1, y1): ''' Is (x0, y0) on a shared diagonal with (x1, y1)? ''' dy = abs(y1 - y0) dx = abs(x1 - x0) return dx == dydef col_clashes(bs, c): '''Return True if the queen at column c clasheswith any queen to its left. ''' for i in range(c):if share_diagonal(i, bs[i], c, bs[c]): return True return Falsedef has_clashes(the_board): '''Determine whether we have any queens clashing on the diagonals.We’re assuming here that the_board is a permutation of columnnumbers, so we’re not explicitly checking row or column clashes.If it has clashes, return True. ''' for col in range(1, len(the_board)):if col_clashes(the_board, col): return True return Falsedef interchange_list(j, k, list): temp = list[j] list[j] = list[k] list[k] = tempdef generating_next_permutation_in_lexicographic_order(per_list): n = len(per_list) - 1 j = n - 1 while per_list[j] > per_list[j + 1]:j = j - 1if j < 0: return 0 k = n while per_list[j] > per_list[k]:k = k - 1 interchange_list(j, k, per_list) r = n s = j + 1 while r > s:interchange_list(r, s, per_list)r = r - 1s = s + 1 return per_listdef main(num): per_list = list(range(0, num)) tries = 0 num_found = 0 result = [] while per_list != 0:tries += 1if not has_clashes(per_list): #print('Found solution {0} in {1} tries.'.format(per_list, tries)) list1 = per_list result.append(list1) #print(result) num_found += 1per_list = generating_next_permutation_in_lexicographic_order(per_list) print(num_found) print(result) main(8)
打印結果為92[[7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0], [7, 6, 5, 4, 3, 2, 1, 0]][Finished in 0.2s]為啥result都變成一樣的了?
問題解答
回答1:問題出在generating_next_permutation_in_lexicographic_order這個函數。Python里List是可變類型,所以你全局事實上只操作了一個List,然后不斷把同一個List的引用放入result里面當然會是這樣。一種簡單的修改:
generating_next_permutation_in_lexicographic_order(per_list): import copy per_list = copy.deepcopy(per_list) #剩下是你原來的代碼
相關文章:
1. android - 優酷的安卓及蘋果app還在使用flash技術嗎?2. android - 使用百度sdk調用SDKInitializer.initialize(this)時報錯?3. javascript - webpack-dev-server和webpack沖突嗎4. javascript - 最近用echarts做統計圖時遇到兩個問題!!5. 淺談Vue使用Cascader級聯選擇器數據回顯中的坑6. html5 - 用h5本地存儲是否安全?7. javascript - 使用百度文本編輯器ueditor不顯示樣式問題8. 微信公眾號在線生成二維碼帶參數怎么搞?9. javascript - react熱加載的一段代碼10. css3 - img垂直水平居中問題

網公網安備