मुझे दिए गए बिंदु पर एक चक्र शुरू करने और समाप्त होने की आवश्यकता है। यह गारंटी नहीं है कि यह मौजूद है। मैं bool[,] points
का उपयोग यह इंगित करने के लिए करता हूं कि कौन सा बिंदु चक्र में हो सकता है। सिक्के केवल ग्रिड पर हो सकता है। points
इंगित करता है कि ग्रिड पर दिया गया बिंदु चक्र में हो सकता है या नहीं। मुझे इस चक्र को न्यूनतम अंक के रूप में उपयोग करने की आवश्यकता है। एक बिंदु केवल एक बार उपयोग किया जा सकता है। कनेक्शन केवल लंबवत या क्षैतिज हो सकता है।साइकिल खोज एल्गोरिदम
मृत ImageShack को हटाने के लिंक
मैंने महसूस किया कि मैं यह कर सकता:
यह हमारे अंक (लाल बिंदु शुरू कर रहा है) हो
while(numberOfPointsChanged)
{
//remove points that are alone in row or column
}
तो मेरे पास है:
मृत छविशैक लिंक को हटाने
अब, मैं पथ पा सकता हूं।
को हटाने मृत 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;
}
लेकिन यह काम नहीं करता। जिस पथ में पाया गया वह दो बिंदु है: शुरू करें और यह पहला पड़ोसी है।
मैं क्या गलत कर रहा हूँ?
संपादित करें: उल्लेख करने के लिए भूल गए ... क्षैतिज कनेक्शन के बाद ... क्या प्रत्येक पंक्ति और स्तंभ में अधिक है वहाँ अधिकतम दो अंक (होने की जरूरत है, ऊर्ध्वाधर क्षैतिज, खड़ी और इतने पर होना करने के लिए वहाँ है दो या कोई नहीं) जो चक्र में हैं। लेकिन यह स्थिति वही है जैसे "चक्र सबसे छोटा होना चाहिए"।
क्या आप एक "लूप" बुला रहे हैं आमतौर पर ग्राफ सिद्धांत में एक "चक्र" कहा जाता है (और यह बिल्कुल स्पष्ट आप "लूप" द्वारा क्या मतलब जब तक मैं अपने चित्रों को देखा था नहीं था)। मैंने इसे समझने के लिए उचित रूप से प्रश्न संपादित किया। फिर भी, यह स्पष्ट नहीं है कि आपके बिंदु दो-आयामी बुलियन सरणी में कैसे संग्रहीत किए जाते हैं। –
यह स्पष्ट करने के लिए संपादित किया गया कि मैं अंक कैसे संग्रहीत करता हूं। –
यह एक सी # प्रश्न नहीं है, केवल एल्गोरिदम के बारे में एक सवाल है। –