【问题标题】:C# - Looping through pairs and matchingC# - 循环配对和匹配
【发布时间】:2013-03-27 08:06:42
【问题描述】:

所以我被困在一个程序中,我有一系列对可能会或可能不会连接在一起以形成通过对的完整路径的程序。我需要能够检查一对中的第二个项目是否可以匹配另一对中的第一个项目,依此类推,直到没有任何对。例如,我的配对可能是:

(1,5)
(2,4)
(3,2)
(5,3)
(4,3)

我需要能够以某种方式遍历这些对,并根据一对的第二个数字是否与下一个对的第一个数字匹配,检查我是否可以获得穿过每个对的完整路径。在此示例中,输出将是:

(1,5), (5,3), (3,2), (2,4), (4,3)

形成一个完整的匹配。如果无法形成匹配,我需要报告失败。输入基于文本文件。到目前为止,我已经能够使用 Streamreader 读取文件并根据换行符拆分对,然后遍历并根据逗号将每对拆分为其项目。我对如何进行几乎一无所知,如果有人有一些想法,我将不胜感激。

StreamReader sr = new StreamReader("inputs.txt");
string line = null;
line = sr.ReadToEnd();
var str = line.Trim().Split('\n');
int length = str.Length;
int index=1;

while (index < length)
{
    var pair = str[index].Split(',');
    var item1 = pair[0];
    var item2 = pair[1];
}

【问题讨论】:

    标签: c# algorithm while-loop streamreader


    【解决方案1】:

    你描述的问题可以转换成另一种形式; graph

    这是您给出的示例的外观。

    我画了一个从 1 到 5 的箭头,因为有一对 (1,5) 等等。

    这样的图上的路径只能按照箭头的方向。

    您想知道的是:“此图中是否有一条路径使用每一对,即越过每条边?”

    这样的路径被称为Eulerian Directed Path

    维基百科列出了两种用于查找此类路径的算法,即 Fleury 和 Hierholzer,这两种算法都是在 1800 年代后期发现的。希望这能让您了解从何处着手解决此问题。

    【讨论】:

    • 非常有趣。这让我阅读了更多关于图论和欧拉解决的“柯尼斯堡七桥”的信息。我从来没有想过像这样的问题可以被重新想象成一个图表,感谢发布!
    【解决方案2】:

    警告:这未经测试!!

    using System;
    using System.IO;
    
    class t1{
    public static void Main(String[] args)
    {
        StreamReader sr = new StreamReader("inputs.txt");
        string line = null;
        line = sr.ReadToEnd();
        var str = line.Trim().Split('\n');
        int length = str.Length;
        int[][] arr=new int[10][];//[str.Length][2];
        int index=0;
    
        while (index < length)
        {
            var pair = str[index].Split(',');
            var item1 = Convert.ToInt32(pair[0]);
            var item2 = Convert.ToInt32(pair[1]);
            arr[index]=new int[]{item1,item2};
    
            index++;
        }
    
        for (int i=0;i<arr.Length;i++)
        {
            for (int j=i+1;j<arr.Length;j++)
            {
                if  (arr[i][1] == arr[j][0])
                {
                        //MATCH
                }
                else
                {
                        //FAILURE
                 }
            }
        }
    }
    }
    

    【讨论】:

      【解决方案3】:

      首先,您需要去掉括号 - 如果它们存在于您的输入文件中。请参阅string.Trim 方法。

      蛮力方法:

      public class Pair
      {
        public string First;
        public string Second;
      }
      
      
      List<Pair> pairs = new List<Pair>();
      for (int index = 0; iter < str.Length; index++)
      {
          var pair = str[index].Split(',');
          pairs.Add(new Pair(){First = pair[0], Second = pair[1]});
      }
      
      List<Pair> ordered = new List<Pair>();
      ordered.Add(pairs[0]);
      pairs.RemoveAt(0);
      
      while (pairs.Count > 0)
      {
          bool found = false;
          for (int iter = 0; iter < pairs.Count; iter++)
          {
              if (ordered[ordered.Count - 1].Second == pairs[iter].First)
              {
                  ordered.Add(pairs[iter]);
                  pairs.RemoveAt(iter);
                  found = true;
                  break;
              }
          }
          if (!found)
          {
            <report error>
            break;
          }
      }
      

      错误检查留给读者作为练习。

      【讨论】:

      • 太好了,谢谢!看起来我可以用它来让我的程序正常工作。有一件事 - 我所有的“第二个”值都附加了“\r”(由于这些对位于我的输入文件的单独行上),因此即使数字相同,也永远不会等于“第一”中的值.有没有办法在比较之前从这些值中删除这个返回字符?再次感谢。
      • 另外,当我找到第一场比赛时,我想打破吗?我需要在整个系列赛中找到一条路径,而不仅仅是在一场比赛为真之后。
      • @noclist - 看看stringTrim方法。
      • @noclist - 关于何时中断:代码在while 循环内有一个for 循环。只要找到可用于继续有序路径的合适项目,for 循环就会停止。这取决于你对数据的了解——如果可能有多个这样的项目,你需要想出一个策略来选择其中一个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2019-10-11
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多