Uncoding.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using static System.Runtime.InteropServices.JavaScript.JSType;
  7. namespace Uncoding_Prufera
  8. {
  9. internal class Uncoding
  10. {
  11. public void Uncode_Prufer()
  12. {
  13. string path = "code_pruf.txt";
  14. string path_write = "graph_trees.txt";
  15. StreamReader sr = new StreamReader(path);
  16. int numbers = 0;
  17. while (!sr.EndOfStream) //Цикл для ввода из файла в лист
  18. {
  19. numbers = Convert.ToInt32(sr.ReadLine().Trim());
  20. }
  21. sr.Close();
  22. Console.WriteLine("Код Прюфера: "+numbers+"\n");
  23. List<int> list_code = numbers.ToString().Select(digit => int.Parse(digit.ToString())).ToList(); //Запись в лист по числам код прюфера
  24. List<int> list_array_num = new List<int>(); //Лист для массива чисел n+2
  25. List<int> list_uniq_num = new List<int>(); //Лист для записи уникальных чисел, которых нет в коде Прюфера
  26. List<int> list_uncode_pruf = new List<int>(); //Лист с вершинами графа по коду
  27. for (int i = 0; i < list_code.Count + 2; i++) //Заполнение листа чисел n+2
  28. {
  29. list_array_num.Add(i + 1);
  30. }
  31. while (list_code.Count > -1) //Основой цикл для выполнения всего алгоритма
  32. {
  33. for (int i = 0; i < list_array_num.Count; i++) //Поиск уникальных чисел, которых нет в коде Прюфера
  34. {
  35. if (list_code.IndexOf(list_array_num[i]) == -1) //Если равно -1, то число уникальное
  36. {
  37. list_uniq_num.Add(list_array_num[i]);
  38. }
  39. }
  40. if(list_code.Count > 0) //Выполнение алгоритма, если хоть есть одно число в коде прюфера
  41. {
  42. list_uncode_pruf.Add(list_code[0]);
  43. list_uncode_pruf.Add(list_uniq_num.Min());
  44. list_code.RemoveAt(0);
  45. list_array_num.RemoveAt(list_array_num.IndexOf(list_uniq_num.Min()));
  46. list_uniq_num.Clear();
  47. }
  48. else if(list_code.Count == 0) //Если чисел в коде Прюфера не осталось, то записываются последние 2 цифры из массива n+2
  49. {
  50. list_uncode_pruf.Add(list_array_num[0]);
  51. list_uncode_pruf.Add(list_array_num[1]);
  52. list_uniq_num.Clear();
  53. break;
  54. }
  55. }
  56. using (StreamWriter wr = new StreamWriter(path_write)) //Запись в файл
  57. {
  58. for (int i = 0; i < list_uncode_pruf.Count; i++)
  59. {
  60. i++;
  61. wr.WriteLine(list_uncode_pruf[i - 1] + "->" + list_uncode_pruf[i]);
  62. Console.WriteLine(list_uncode_pruf[i - 1] + "->" + list_uncode_pruf[i]);
  63. }
  64. }
  65. }
  66. }
  67. }