2012-08-16 77 views
1

這應該是一個簡單的邏輯問題,但由於某種原因,我一直在努力嘗試使用半乾淨算法來實現這一點。我使用的是具有SQL Server背景的MVC3,但即使您不瞭解MVC,您仍然可以使用該算法來幫助我。使嚮導導航更簡單的簡單算法

我正在編寫一個使用嚮導式界面的應用程序。目前,這些嚮導屏幕之間的導航是非常線性的(下一個按鈕會立即進入頁面,之前的按鈕會立即轉到頁面)。由於範圍變化(有趣,我知道),現在我被告知要減少線性。

對於第一行程,用戶訪問以線性順序的所有頁面,就像這樣:

Step 1 
Step 2 
Step 3 
    SubStep 1 
     Sub-SubStep 1 
     Sub-SubStep 2 
    SubStep 2 
     Sub-SubStep 1 
     Sub-SubStep 2 
    ... 
    SubStep *n* 
     Sub-SubStep 1 
     Sub-SubStep 2 
Submission 

ň是基於一些變量,在步驟2中輸入

嚮導提交後,由管理員審查。如果他們發現信息丟失,他們可以解鎖某些頁面。當用戶返回輸入該信息時,他們應該只能查看這些特定頁面。例如,導航可能是這樣的:

Step 2 
Step 3 
    SubStep 1 
     Sub-SubStep2 
Submission 

我目前的實現包括一個數據庫中的一個表,跟蹤未鎖定的頁面。當點擊「下一步」按鈕時,它會調用一個方法來確定下一頁是什麼。由於步驟3中發生的奇怪和可變的導航,這個方法是一個if-else分支的噩夢,很容易被破壞。

任何建議,簡化這將不勝感激。

+0

任何代碼示例都會有所幫助。 – Cracker 2012-08-16 17:42:52

回答

2

如果您創建表示導航層次結構的樹結構,樹的preorder traversal將按所需的線性順序打印頁面。你可以運行這樣的遍歷,當你點擊當前頁面時,你可以繼續遍歷,直到找到一個解鎖的頁面,這將是所需的下一頁。

僞代碼:

class TreeNode: 
    string name 
    List<TreeNode> children 

string findNextPage(TreeNode node, Set<string> unlockedPageNames, 
        string currentPageName, ref bool currentPageFound): 
    if currentPageFound && unlockedPageNames.Contains(node.name): 
     return node.name 
    if node.name == currentPageName: 
     currentPageFound = true 
    foreach child in children: 
     result = findNextPage(child, unlockedPageNames, 
           currentPageName, currentPageFound) 
     if result != null: 
      return result 
    return null 

string findNextPage(TreeNode node, Set<string> unlockedPageNames, 
        string currentPageName): 
    bool currentPageFound = false 
    return findNextPage(node, unlockedPageNames, 
         currentPageName, currentPageFound) 

請注意,您需要一個根節點,其子女必須在步驟1,步驟2和步驟3。通過這個根節點到最後findNextPage()功能。

+0

僞代碼會很有幫助。我不經常使用樹:) – jebar8 2012-08-16 17:52:37

+1

再次感謝!我能夠完美地調整這個解決方案。 – jebar8 2012-08-17 03:33:10