//I. 298. //Fényes Balázs 10. o. t. //Budapest, Szerb A. Gimn. //fenyes.balazs@freemail.hu // using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace i298 { class i298 { static void Main(string[] args) { String[] lines = File.ReadAllText(args[0]).Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); //a beolvasott fájl int N = int.Parse(lines[0].Split(' ')[0]); //asztal mérete int M = int.Parse(lines[0].Split(' ')[1]); //golyók száma var golyok = new List() { }; for (int i = 1; i <= M; i++) { golyok.Add(new Golyo(int.Parse(lines[i].Split(' ')[0]), int.Parse(lines[i].Split(' ')[1]), false)); } Golyo A = new Golyo(int.Parse(lines[lines.Length - 1].Split(' ')[0]), int.Parse(lines[lines.Length - 1].Split(' ')[1]), false); //ezt a golyót gurítjuk el Golyo B = new Golyo(int.Parse(lines[lines.Length - 1].Split(' ')[2]), int.Parse(lines[lines.Length - 1].Split(' ')[3]), false); //ezt kell eltalálni golyok.Remove(A); //a "golyok" listában lesznek azok a golyók amiket nem szabad eltalálni illetve azok a golyók //ebben a listában benne hagyom azt a golyót, amelyet el kell találni, ennek az lesz a szerepe, hogy nem tudunk átlőni többször azon a golyón golyok.Remove(B); B.cel = true; golyok.Add(B); //megjelöljük azt a golyót, amit el kell találni var t = new List[5, 5]; //a középső asztal beállítása t[2, 2] = golyok; for (int x = -2; x <= 2; x++) for (int y = -2; y <= 2; y++) { //(II.) if (x == 0 && y == 0) continue; if (Math.Abs(x) + Math.Abs(y) > 2) continue; t[x + 2, y + 2] = golyok.ToList();//mindegyik asztalra rárakjuk a középső asztal golyóit, majd ezután tükrözzük és eltoljuk őket if (Math.Abs(x) % 2 == 1) { //tükrözés függőleges tengelyre for (int i = 0; i < t[x + 2, y + 2].Count; i++) { Golyo g = t[x + 2, y + 2][i]; t[x + 2, y + 2][i] = new Golyo(N + 1 - g.x, g.y, g.cel); } } if (Math.Abs(y) % 2 == 1) { //tükrözés vízszintes tengelyre for (int i = 0; i < t[x + 2, y + 2].Count; i++) { Golyo g = t[x + 2, y + 2][i]; t[x + 2, y + 2][i] = new Golyo(g.x, N + 1 - g.y, g.cel); } } //eltolás a megfelelő asztalra for (int i = 0; i < t[x + 2, y + 2].Count; i++) { Golyo g = t[x + 2, y + 2][i]; t[x + 2, y + 2][i] = new Golyo(g.x + (N - 1) * x, g.y + (N - 1) * y, g.cel); } } var tavolsagok = new List() { }; //a falakról való visszapattanások száma mindegyik megfelelő esetben for (int x = -2; x <= 2; x++) for (int y = -2; y <= 2; y++) { // (I.) int tav = Math.Abs(x) + Math.Abs(y); if (tav > 2) continue; Golyo cel = t[x + 2, y + 2].First(pt => pt.cel); //ezt a golyót kell eltalálni bool siker = true; int xmin = (x < 0 ? x : 0); int xmax = (x < 0 ? 0 : x); int ymin = (y < 0 ? y : 0); int ymax = (y < 0 ? 0 : y); for (int x_ = xmin; x_ <= xmax; x_++) for (int y_ = ymin; y_ <= ymax; y_++) //(III.) for (int i = 0; i < t[x_ + 2, y_ + 2].Count; i++) if (!t[x_ + 2, y_ + 2][i].Equals(cel)) { float d = calcdist(A.x, A.y, cel.x, cel.y, t[x_ + 2, y_ + 2][i].x, t[x_ + 2, y_ + 2][i].y); //a szakasz és a pont távolsága if (d < 1E-5) //hibahatár { siker = false; goto end; } } end: if (siker) tavolsagok.Add(tav); } Console.WriteLine("Ket pattanas: " + tavolsagok.Count(s => s == 2)); Console.WriteLine("Egy pattanas: " + tavolsagok.Count(s => s == 1)); Console.WriteLine("Nulla pattanas: " + tavolsagok.Count(s => s == 0)); Console.Read(); } //felhasználva: http://www.gamedev.net/topic/198199-distance-from-point-to-line-segment/page__st__-20__p__2252588#entry2252588 static float calcdist(float x1, float y1, float x2, float y2, float px, float py) { float Xu = px - x1; float Yu = py - y1; float Xv = x2 - x1; float Yv = y2 - y1; if (Xu * Xv + Yu * Yv < 0) return (float)Math.Sqrt(Math.Pow(px - x1, 2) + Math.Pow(py - y1, 2)); Xu = px - x2; Yu = py - y2; Xv = -Xv; Yv = -Yv; if (Xu * Xv + Yu * Yv < 0) return (float)Math.Sqrt(Math.Pow(px - x2, 2) + Math.Pow(py - y2, 2)); return (float) Math.Abs((px * (y1 - y2) + py * (x2 - x1) + (x1 * y2 - x2 * y1)) / Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2))); } struct Golyo { public int x, y; public bool cel; public Golyo(int x_, int y_, bool cel_) { x = x_; y = y_; cel = cel_; } public override bool Equals(object obj) { Golyo g = (Golyo)obj; return g.x == x && g.y == y && g.cel == cel; } } } }