我需要找到一個循環開始和結束在給定點。不能保證它存在。 我使用bool[,] points
來指示哪個點可以在循環中。 Poins只能在網格上。 points
指示網格上的給定點是否可以循環。 我需要使用最少的點數來找到這個循環。 一點只能使用一次。 連接只能是垂直或水平。週期尋找算法
讓這成爲我們的點(紅色起點):
去除死皮ImageShack的鏈接
我意識到,我可以這樣做:
while(numberOfPointsChanged)
{
//remove points that are alone in row or column
}
所以我有:
刪除死ImageShack鏈接
現在,我可以找到路徑。
去除死皮ImageShack的鏈接
但是,如果有不是由這個循環刪除,但不應該在路徑點?
我已經寫代碼:
class MyPoint
{
public int X { get; set; }
public int Y { get; set; }
public List<MyPoint> Neighbours = new List<MyPoint>();
public MyPoint parent = null;
public bool marked = false;
}
private static MyPoint LoopSearch2(bool[,] mask, int supIndexStart, int recIndexStart)
{
List<MyPoint> points = new List<MyPoint>();
//here begins translation bool[,] to list of points
points.Add(new MyPoint { X = recIndexStart, Y = supIndexStart });
for (int i = 0; i < mask.GetLength(0); i++)
{
for (int j = 0; j < mask.GetLength(1); j++)
{
if (mask[i, j])
{
points.Add(new MyPoint { X = j, Y = i });
}
}
}
for (int i = 0; i < points.Count; i++)
{
for (int j = 0; j < points.Count; j++)
{
if (i != j)
{
if (points[i].X == points[j].X || points[i].Y == points[j].Y)
{
points[i].Neighbours.Add(points[j]);
}
}
}
}
//end of translating
List<MyPoint> queue = new List<MyPoint>();
MyPoint start = (points[0]); //beginning point
start.marked = true; //it is marked
MyPoint last=null; //last point. this will be returned
queue.Add(points[0]);
while(queue.Count>0)
{
MyPoint current = queue.First(); //taking point from queue
queue.Remove(current); //removing it
foreach(MyPoint neighbour in current.Neighbours) //checking Neighbours
{
if (!neighbour.marked) //in neighbour isn't marked adding it to queue
{
neighbour.marked = true;
neighbour.parent = current;
queue.Add(neighbour);
}
//if neighbour is marked checking if it is startig point and if neighbour's parent is current point. if it is not that means that loop already got here so we start searching parents to got to starting point
else if(!neighbour.Equals(start) && !neighbour.parent.Equals(current))
{
current = neighbour;
while(true)
{
if (current.parent.Equals(start))
{
last = current;
break;
}
else
current = current.parent;
}
break;
}
}
}
return last;
}
但它不工作。它創建的路徑包含兩點:開始和它的第一個鄰居。
我在做什麼錯?
編輯: 忘了提...橫向連接後,必須有垂直,水平,垂直等... 更重要的是每行和每列有需要是最大的兩個點(兩個或沒有)在週期中。但是這種情況與「週期必須是最短的週期」是一樣的。
你所說的「循環」在圖論中通常被稱爲「循環」(在我看過你的照片之前,「循環」的含義並不完全清楚)。我編輯了適當的問題,使其易於理解。仍然不清楚你的點如何存儲在二維布爾數組中。 – 2010-12-19 14:25:20
編輯,以澄清我如何存儲積分。 – 2010-12-19 14:34:48
這不是C#的問題,僅僅是關於算法的問題。 – 2010-12-19 14:38:52