Program.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text.RegularExpressions;
  7. namespace D10._1
  8. {
  9. class Map : List<(int x, int y, int vx, int vy)> { }
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. if (args.Length < 1) return;
  15. if (File.Exists(args[0]) == false) return;
  16. var file = File.OpenText(args[0]);
  17. var r = new Regex(@"position=<\s*(?<posx>-?\d+),\s*(?<posy>-?\d+)> velocity=<\s*(?<vx>-?\d+),\s*(?<vy>-?\d+)>");
  18. var map = new Map();
  19. do
  20. {
  21. var line = file.ReadLine();
  22. if (line == null) break;
  23. var result = r.Match(line);
  24. map.Add((
  25. int.Parse(result.Groups["posx"].Value),
  26. int.Parse(result.Groups["posy"].Value),
  27. int.Parse(result.Groups["vx"].Value),
  28. int.Parse(result.Groups["vy"].Value)
  29. ));
  30. } while (true);
  31. int tt = 0;
  32. do
  33. {
  34. for (var i = 0; i< map.Count; ++i)
  35. {
  36. var star = map[i];
  37. star.x += star.vx;
  38. star.y += star.vy;
  39. map[i] = star;
  40. }
  41. } while (isOk(map) == false);
  42. int minX = map.Min(m => m.x);
  43. int minY = map.Min(m => m.y);
  44. int maxX = map.Max(m => m.x);
  45. int maxY = map.Max(m => m.y);
  46. var bmp = new Bitmap(maxX - minX + 1, maxY - minY + 1);
  47. foreach (var star in map)
  48. {
  49. bmp.SetPixel(star.x - minX, star.y - minY, Color.Red);
  50. }
  51. bmp.Save("out.bmp");
  52. }
  53. static bool isOk(Map map)
  54. {
  55. for (var i = 0; i < map.Count; ++i)
  56. if (isIsolated(map, i)) return false;
  57. return true;
  58. }
  59. static bool isIsolated(Map map, int current)
  60. {
  61. var currentStar = map[current];
  62. foreach (var star in map)
  63. {
  64. if (star.x == currentStar.x && star.y == currentStar.y)
  65. continue;
  66. if (star.x == currentStar.x && (star.y == currentStar.y + 1 || star.y == currentStar.y - 1))
  67. return false;
  68. if (star.y == currentStar.y && (star.x == currentStar.x + 1 || star.x == currentStar.x - 1))
  69. return false;
  70. if ((star.x == currentStar.x + 1 || star.x == currentStar.x - 1) && (star.y == currentStar.y + 1 || star.y == currentStar.y - 1))
  71. return false;
  72. if ((star.y == currentStar.y + 1 || star.y == currentStar.y - 1) && (star.x == currentStar.x + 1 || star.x == currentStar.x - 1))
  73. return false;
  74. }
  75. return true;
  76. }
  77. }
  78. }