2012-08-16 45 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