| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Text.RegularExpressions;
- namespace D10._1
- {
- class Map : List<(int x, int y, int vx, int vy)> { }
- class Program
- {
- static void Main(string[] args)
- {
- if (args.Length < 1) return;
- if (File.Exists(args[0]) == false) return;
- var file = File.OpenText(args[0]);
- var r = new Regex(@"position=<\s*(?<posx>-?\d+),\s*(?<posy>-?\d+)> velocity=<\s*(?<vx>-?\d+),\s*(?<vy>-?\d+)>");
- var map = new Map();
- do
- {
- var line = file.ReadLine();
- if (line == null) break;
- var result = r.Match(line);
- map.Add((
- int.Parse(result.Groups["posx"].Value),
- int.Parse(result.Groups["posy"].Value),
- int.Parse(result.Groups["vx"].Value),
- int.Parse(result.Groups["vy"].Value)
- ));
- } while (true);
- int tt = 0;
- do
- {
- for (var i = 0; i< map.Count; ++i)
- {
- var star = map[i];
- star.x += star.vx;
- star.y += star.vy;
- map[i] = star;
- }
- } while (isOk(map) == false);
- int minX = map.Min(m => m.x);
- int minY = map.Min(m => m.y);
- int maxX = map.Max(m => m.x);
- int maxY = map.Max(m => m.y);
- var bmp = new Bitmap(maxX - minX + 1, maxY - minY + 1);
- foreach (var star in map)
- {
- bmp.SetPixel(star.x - minX, star.y - minY, Color.Red);
- }
- bmp.Save("out.bmp");
- }
- static bool isOk(Map map)
- {
- for (var i = 0; i < map.Count; ++i)
- if (isIsolated(map, i)) return false;
- return true;
- }
- static bool isIsolated(Map map, int current)
- {
- var currentStar = map[current];
- foreach (var star in map)
- {
- if (star.x == currentStar.x && star.y == currentStar.y)
- continue;
- if (star.x == currentStar.x && (star.y == currentStar.y + 1 || star.y == currentStar.y - 1))
- return false;
- if (star.y == currentStar.y && (star.x == currentStar.x + 1 || star.x == currentStar.x - 1))
- return false;
- if ((star.x == currentStar.x + 1 || star.x == currentStar.x - 1) && (star.y == currentStar.y + 1 || star.y == currentStar.y - 1))
- return false;
- if ((star.y == currentStar.y + 1 || star.y == currentStar.y - 1) && (star.x == currentStar.x + 1 || star.x == currentStar.x - 1))
- return false;
- }
- return true;
- }
- }
- }
|