所以我被困在一个程序中,我有一系列对,可能会或可能不能连接在一起形成一对完整的路径。我需要能够检查一对中的第二项是否可以匹配另一对中的第一项,依此类推,直到没有对为止。例如,我的配对可能是:
(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];
}
答案 0 :(得分:2)
您描述的问题可以转换为其他形式;一个graph。
以下是您给出的示例的样子。
我从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
}
}
}
}
}