摘要:的結(jié)果與原書的結(jié)果不符。上一篇程序員的算法趣題欲速則不達程序員的算法趣題欲速則不達下一篇程序員的算法趣題同時結(jié)束的沙漏本系列總目錄參見程序員的算法趣題詳細分析和全解程序員的算法趣題詳細分析和全解
目錄
????????問題:對2n張牌洗牌,并求當(dāng)1<=n<=100時,一共有多少個n可以使得經(jīng)過2(n-1)次洗牌后,恢復(fù)最初順序?分兩種情況考慮:
????????Case1: 2(n-1)次洗牌后,牌恢復(fù)最初順序
????????Case2: 2(n-1)次洗牌后第一次恢復(fù)順序
????????Case2可以看作是case1的一種特殊情況。Case1的意思是,如果在m{其中m為2(n-1)的因子}次洗牌后回復(fù)最初順序即可。
????????第一感是以下這個‘高大上’的想法:
????????呃。。。雖說如此,群論只學(xué)了一丟丟。。。等我先把群論學(xué)一學(xué)再來看這條路能不能走通。本系列其實出現(xiàn)過好幾道可以用群論來解決的問題。群論學(xué)習(xí)從開始到放棄經(jīng)歷過好多次了,這次帶著問題去學(xué)習(xí)看看能不能走得遠一些。?
????????(沒有別的更炫的法子時)蠻干就是了。。。
????????針對每一個n,從初始狀態(tài)(初始狀態(tài)是什么并不重要)開始,以迭代的方式進行以上permutation操作,并判斷是否回到了最初狀態(tài)。
????????算法流程如下:
# -*- coding: utf-8 -*-"""Created on Sat Oct 9 19:33:11 2021@author: chenxy"""# import sysimport time# import datetime# import math# import random# from typing import List# from queue import Queue# from collections import deque# import itertools as itimport numpy as npN = 100ok_list = []tStart = time.perf_counter()for n in range(1,N+1): start = np.arange(2*n) p = np.zeros_like(start) for k in range(n): p[2*k] = start[k] p[2*k+1] = start[n+k] # print(p) cur = start cnt = 0 # recover = False while 1: cur = cur[p] cnt = cnt + 1 if np.array_equal(cur, start): # print(n, cur, start, cnt) if (2*(n-1) % cnt) == 0: # if (2*(n-1)) == cnt: # print(n, cur, start, cnt) # recover = True ok_list.append(n) break if cnt > 2*(n-1): break # if recover: # ok_list.append(n)tCost = time.perf_counter() - tStart print("length of ok_list = {0}, tCost = {1:6.3f}(sec)".format(len(ok_list),tCost))print(ok_list)
case1運行結(jié)果:
length of ok_list = 46, tCost = ?0.046(sec)
[1, 2, 3, 4, 6, 7, 9, 10, 12, 15, 16, 19, 21, 22, 24, 27, 30, 31, 34, 36, 37, 40, 42, 45, 49, 51, 52, 54, 55, 57, 64, 66, 69, 70, 75, 76, 79, 82, 84, 87, 90, 91, 96, 97, 99, 100]
case2運行結(jié)果(注釋掉 "if (2*(n-1) % cnt) == 0:",打開 “?if (2*(n-1)) == cnt:)":
length of ok_list = 45, tCost = ?0.059(sec)
[2, 3, 4, 6, 7, 9, 10, 12, 15, 16, 19, 21, 22, 24, 27, 30, 31, 34, 36, 37, 40, 42, 45, 49, 51, 52, 54, 55, 57, 64, 66, 69, 70, 75, 76, 79, 82, 84, 87, 90, 91, 96, 97, 99, 100]
????????尷尬。。。case2的結(jié)果與原書的結(jié)果不符。想不出哪里不對,哪個小伙伴看出來毛病來了請不吝指教^-^
? ? ? ? 兩個遺留事項:
? ? ? ? (1) 基于群論的解決方法
? ? ? ? (2) case2的結(jié)果不對
? ? ? ? 嗯,我一定會回來的。。。
? ? ? ? 上一篇:程序員的算法趣題Q49: 欲速則不達
? ? ? ? 下一篇:程序員的算法趣題Q51: 同時結(jié)束的沙漏
????????本系列總目錄參見:程序員的算法趣題:詳細分析和Python全解
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/122179.html
摘要:本文先考慮深度優(yōu)先搜索。深度優(yōu)先搜索算法流程如下最后,將初始化為,初始化,和分別初始化為適當(dāng)?shù)娜銛?shù)組,然后調(diào)用到最終退出后所得到的即為所求結(jié)果。 目錄 1. 問題描述 2. 解題分析 3. 代碼及測試 4. 后記 1. 問題描述 2. 解題分析 ????????本題是要找最長路徑,應(yīng)該...
摘要:且聽下回分解基于動態(tài)規(guī)劃策略的優(yōu)化解法參見程序員的算法趣題偷懶的算盤上一篇程序員的算法趣題同數(shù)包夾程序員的算法趣題同數(shù)包夾本系列總目錄參見程序員的算法趣題詳細分析和全解程序員的算法趣題詳細分析和全解 目錄 1. 問題描述 2. 解題分析 3. 代碼及測試 4. 后記 1. 問題描述 ??...
摘要:假設(shè)有幾個小朋友以相同間隔圍成圓周,要結(jié)對用紙杯電話相互通話。如果繩子交叉,很有可能會纏繞起來,所以結(jié)對的原則是不能讓繩子交叉。如下所示運行結(jié)果上一篇異或楊輝三角形下一篇禁止右轉(zhuǎn)本系列總目錄參見程序員的算法趣題詳細分析和全解 目錄 1. 問題描述 2. 解題分析 3. 代碼及測試 1. 問...
摘要:可以在遍歷所有矩陣時,對各種出現(xiàn)的次數(shù)進行計數(shù),最后計數(shù)值為的個數(shù)即為所求結(jié)果。上一篇排序交換次數(shù)的最少化排序交換次數(shù)的最少化本系列總目錄參見程序員的算法趣題詳細分析和全解程序員的算法趣題詳細分析和全解 目錄 1. 問題描述 2. 解題分析 3. 代碼及測試 4. 后記 1. 問題描述 ...
閱讀 2100·2021-11-11 16:55
閱讀 3170·2021-10-11 10:58
閱讀 3037·2021-09-13 10:28
閱讀 3967·2021-07-26 23:57
閱讀 1005·2019-08-30 15:56
閱讀 1331·2019-08-29 13:15
閱讀 1258·2019-08-26 18:18
閱讀 1266·2019-08-26 13:44