private void HidddenRMLTraversal(ref int citiesQuantity, TwoWayLinkedList cities, Node node) { if (node.IsLeaf()) { if (citiesQuantity != 0) { cities.PushLast(node.value); citiesQuantity--; } else { return; } } else { if (node.rightLeaf != null) { HidddenRMLTraversal(ref citiesQuantity, cities, node.rightLeaf); } if (citiesQuantity != 0) { cities.PushLast(node.value); citiesQuantity--; if (node.leftLeaf != null) { HidddenRMLTraversal(ref citiesQuantity, cities, node.leftLeaf); } } else { return; } } }
public TwoWayLinkedList GetRoute(TwoWayLinkedList chosenCities, City startPoint) { /* * LIST chosenCities SHOULDN'T CONTAIN STARTPOINT */ City currentCity = startPoint; int currentCityIndex = 0; int[] distanceFromCurrentCity; City nearestNeighbour; int nearestNeighbourIndex; TwoWayLinkedList route = new TwoWayLinkedList(); while (chosenCities.GetSize() != 0) { currentCityIndex = FindCurrentCityIndex(currentCity); distanceFromCurrentCity = Dijkstra(CitiesInfo.Distances, currentCityIndex); nearestNeighbourIndex = MinDistanceIndex(distanceFromCurrentCity, chosenCities); nearestNeighbour = CitiesInfo.Cities[nearestNeighbourIndex]; route.Concatenation(intermediateCities[nearestNeighbourIndex]); route.PushLast(nearestNeighbour); chosenCities.DelMidle(chosenCities.IndexOf(nearestNeighbour)); currentCity = nearestNeighbour; } return(ClearRepetitions(route)); }
private TwoWayLinkedList CopyList(TwoWayLinkedList list) { TwoWayLinkedList copy = new TwoWayLinkedList(); foreach (City city in list) { copy.PushLast(city); } return(copy); }
private void HiddenBestCitiesByPopulation(int minPopulation, int maxPopulation, ref int citiesQuantity, TwoWayLinkedList cities, Node node) { if (node.IsLeaf()) { if (node.value.AmountPeople >= minPopulation && node.value.AmountPeople <= maxPopulation) { if (citiesQuantity != 0) { cities.PushLast(node.value); citiesQuantity--; } else { return; } } } else { if (node.rightLeaf != null) { HiddenBestCitiesByPopulation(minPopulation, maxPopulation, ref citiesQuantity, cities, node.rightLeaf); } if (node.value.AmountPeople >= minPopulation && node.value.AmountPeople <= maxPopulation) { if (citiesQuantity != 0) { cities.PushLast(node.value); citiesQuantity--; } else { return; } } if (node.leftLeaf != null) { HiddenBestCitiesByPopulation(minPopulation, maxPopulation, ref citiesQuantity, cities, node.leftLeaf); } } }
private void tourGridViewB_CellContentClick(object sender, DataGridViewCellEventArgs e) { string cityName = tourGridViewB.CurrentCell.Value.ToString(); City city = C.Find(cityName); CC.DelByName(cityName); C = new TwoWayLinkedList(); foreach (City city1 in CC) { C.PushLast(city1); } D.PushLast(city); ShouC(); ShouD(); }
private void givenCitiesGridViewA_CellContentClick(object sender, DataGridViewCellEventArgs e) { string cityName = givenCitiesGridViewA.CurrentCell.Value.ToString(); City city = AA.Find(cityName); AA.DelByName(cityName); A = new TwoWayLinkedList(); foreach (City city1 in AA) { A.PushLast(city1); } B.PushLast(city); ShouA(); ShouB(); }
private TwoWayLinkedList ClearRepetitions(TwoWayLinkedList listWithRepetetives) { /* * Unfortunately, GetRoute method has some issues. It creates necessary list, it's already good, * but also contains some repetetive cities. This problem isn't fatal, so this method was created * to fix it. */ TwoWayLinkedList list = new TwoWayLinkedList(); City tmp = new City(".", 0, 0); foreach (City city in listWithRepetetives) { if (tmp.Name != city.Name) { list.PushLast(city); tmp = city; } } return(list); }
//!!!1по нажатию на город на гридвю А нужно из списка А удеалить указаный город Добавить его в список Б //!!!1 и вывести список А в грид А и список Б в Грид Б private void MakeWayBtn_Click(object sender, EventArgs e) { WayCreator wayCreator = new WayCreator(); City city = B.GetFirst(); B.DelFirst(); C = wayCreator.GetRoute(B, city); foreach (City city1 in C) { CC.PushLast(city1); } foreach (City city2 in C) { CClon.PushLast(city2); } ShouC(); groupBoxSelectMandatoryCityToVisit.Enabled = false; // это должно быть в конце метода!!!! groupBoxDefinitionListOfCities.Enabled = true; // это должно быть в конце метода!!!! //!!!1 в грид С передать список городов который был проложен саниным искателем пути (в искатель пути передать спаисок Б) //!!!1 Сделать не активными все уж ненужные елементы формы }
public void QuickSortPeopleYoungerTwenty() { Node pivot = this.last; //Node first = this.head; if (this.Size > 1) { TwoWayLinkedList listMorePivot = new TwoWayLinkedList(); TwoWayLinkedList listLessPivot = new TwoWayLinkedList(); foreach (City city in this) { if (city == this.last.data) { break; } if (city.AmountPeople >= pivot.data.AmountPeopleYoungerTwenty) { listMorePivot.PushFirst(city); } else { listLessPivot.PushFirst(city); } } listMorePivot.QuickSortPeopleYoungerTwenty(); listLessPivot.QuickSortPeopleYoungerTwenty(); listLessPivot.PushLast(pivot.data); listLessPivot.Concatenation(listMorePivot); this.head = listLessPivot.head; this.last = listLessPivot.last; // присваевается концу списка меньших за опорный ибо после конкатенации в списке меньших за опроный // находится уже сума списков больших и меньших за опроных, а список больших остаеться быть таким же и иногода он может быть пустым. } }
private void findCitiesBtn_Click(object sender, EventArgs e) { int amountCytisWichWined = cityNumTrackBar.Value; if (populationRBtn.Checked) { try { if (textBoxPeopleFrom.Text == "") { MessageBox.Show("Минимальное и максимальное значения не могут быть пустыми."); textBoxPeopleFrom.Text = "0"; return; } if (textBoxPeopleTo.Text == "") { MessageBox.Show("Минимальное и максимальное значения не могут быть пустыми."); textBoxPeopleTo.Text = "3611000"; return; } A = citiesBTree.BestCitiesByPopulation(Convert.ToInt32(textBoxPeopleFrom.Text), Convert.ToInt32(textBoxPeopleTo.Text), cityNumTrackBar.Value); //!!!1 вытащить из дерева нужный список добавить на офрму нужные текст боксы для данных аналоично //!!!1 для последующих ийфов. Текстбоксы с мин и макс занчением можно сделать общиедля всех groupBoxSearchAmountCities.Enabled = false; groupBoxSelectMandatoryCityToVisit.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message); } } else if (underTwentyRBtn.Checked) { if (textBoxPeopleFrom.Text == "" && textBoxPeopleTo.Text == "") { MessageBox.Show("Минимальное и максимальное значения не могут быть пустыми."); return; } A = citiesBTree.BestCitiesByPopulationYounger20(Convert.ToInt32(textBoxPeopleFrom.Text), Convert.ToInt32(textBoxPeopleTo.Text), cityNumTrackBar.Value); groupBoxSearchAmountCities.Enabled = false; groupBoxSelectMandatoryCityToVisit.Enabled = true; } else if (citiesHashRBtn.Checked) { A = citiesBTree.GetBestCities(cityNumTrackBar.Value); groupBoxSearchAmountCities.Enabled = false; groupBoxSelectMandatoryCityToVisit.Enabled = true; } else { MessageBox.Show("Выбирите 1 параметр по которому нужно представить города"); return; } foreach (City city in A) { AA.PushLast(city); } //!!!1 добавленые поля толжны стать не доступны после нажатия указаного батона //!!!1 также небходимо будет создать кнопку обнуления которая сбросит вообще все параметры на начало если юзер рукожоп и ошибся //!!!1 вывести в грид вю "givenCitiesGridViewA" список полученый в итоге //!!!1 записать етот полученый список в атрибьут класа "список А" for (int k = 0; k < cityNumTrackBar.Value; k++) { givenCitiesGridViewA.Rows.Add(); } int a = 0; foreach (City city in A) { givenCitiesGridViewA[0, a].Value = city.Name; givenCitiesGridViewA[2, a].Value = city.AmountPeopleYoungerTwenty; givenCitiesGridViewA[1, a].Value = city.AmountPeople; a++; } }