C# - 通过成对和匹配循环

时间:2013-04-05 02:32:32

标签: c# algorithm while-loop streamreader

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

(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];
}

3 个答案:

答案 0 :(得分:2)

您描述的问题可以转换为其他形式;一个graph

以下是您给出的示例的样子。

A directed graph representing your example

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

像这样的图形上的路径只能沿箭头方向移动。

你想知道的是:“这个图表中是否存在使用每一对的路径,即遍历每一条边缘?”

这样的路径称为Eulerian Directed Path

维基百科列出了两种寻找此类路径的算法,Fleury和Hierholzer,两者都是在1800年代后期发现的。希望这能让您了解从哪里开始解决这个问题。

答案 1 :(得分:1)

首先,您需要去除括号 - 如果它们存在于您的输入文件中。请参阅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;
    }
}

错误检查留给读者练习。

答案 2 :(得分:0)

警告:未经测试!!

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
             }
        }
    }
}
}