2012-05-08 33 views
2

需要一種算法以DD/MM HH:MM格式僅使用數字0-9一次查找最早的日期:SS。實際的答案是:26/03 17:48:59使用DD/MM格式的數字0-9僅查找一次最早的日期:MM:SS

+0

蠻力10!可能性在合理的時間內仍然可以計算。你甚至可以從最低字符的月份開始明智地做到這一點,並在你首次找到可行的解決方案時終止。 – amit

+3

不,你不需要算法 - 你已經有了問題的答案。 –

+0

我知道答案,但試圖用程序來計算它。 – devsathish

回答

3

最簡單的方法 - 生成[0 ... 9]的所有排列,並檢查它們是否是有效的日期。

10! = 3 628 800

如果你想提高效率,回溯會有幫助。在這種情況下,這只是一個簡單的約束滿足問題,有效日期的數量遠遠少於排列的數量。此外,還可以考慮他們最低的一個月,然後一天最低次序等

例如

01不起作用,因爲當時的第一個數字(10S小時)需要爲0或1 02不起作用,因爲時間的第一個數字現在必須是1,而日期在2月只能是0,1,2。

依此類推。

FWIW - 只有769有效日期

import datetime 
import itertools 

count = 1 
for perm in itertools.permutations(range(10)): 

    i = 0; 
    day = perm[i]+perm[i+1]*10 
    i+=2 
    month = perm[i]+perm[i+1]*10 
    i+=2 
    hour = perm[i]+perm[i+1]*10 
    i+=2 
    minute = perm[i]+perm[i+1]*10 
    i+=2 
    second = perm[i]+perm[i+1]*10 
    try: 
     print datetime.datetime(2012, month, day, hour, minute, second) 
     count+=1 
    except: 
     pass 

print count 
1

這是一個constraint satisfaction problem。您可能需要先使用日期格式MM/DD HH:MM:SS,然後再轉換您的答案。在這種格式下,字典上最小的有效日期字符串將成爲您所尋求的答案,所以如果系統地搜索,您找到的第一個有效日期就是解決方案。

基本上,您的搜索空間有12 x 31 x 24 x 60 x 60的大部分有效日期。所以,你的約束包括:

month < 13 
day < 32 
hour < 24 
minutes < 60 
seconds < 60 
occurrence(date, i) == 1 for each i = 0 to 9 

然後,您可以使用backtracking search algorithm通過搜索空間系統的進行。

相關問題