using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RandomPlayer { class Program { private const int Size = 15; private string[] field = new string[Size]; // полезные функции private struct Pos { public int i, j; public Pos(int i, int j) { this.i = i; this.j = j; } } private Queue q = new Queue(); private bool[,] used = new bool[Size, Size]; private int[,] area = new int[Size, Size]; private int[,] dist = new int[Size, Size]; private int Dfs(int i, int j) { if (i < 0 || i >= Size || j < 0 || j >= Size) return 0; if (field[i][j] != '.') return 0; if (used[i, j]) return 0; used[i, j] = true; q.Enqueue(new Pos(i, j)); int s = 1; s += Dfs(i + 1, j); s += Dfs(i - 1, j); s += Dfs(i, j + 1); s += Dfs(i, j - 1); return s; } private void CalcArea() // Размеры связных областей { int i, j; for (i = 0; i < Size; i++) { for (j = 0; j < Size; j++) { area[i, j] = 0; used[i, j] = false; } } for (i = 0; i < Size; i++) { for (j = 0; j < Size; j++) { if (area[i, j] == 0 && (field[i][j] == '.')) { int s = Dfs(i, j); while (q.Count > 0) { Pos p = q.Dequeue(); area[p.i, p.j] = s; } } } } } private void BfsMove(int i, int j, int d) { if (i < 0 || i >= Size || j < 0 || j >= Size) return; if (field[i][j] == '4' || field[i][j] == '2') return; if (dist[i, j] >= 0) return; dist[i, j] = d; q.Enqueue(new Pos(i, j)); } private void Bfs(int pi, int pj) { int i, j; for (i = 0; i < Size; i++) { for (j = 0; j < Size; j++) { dist[i, j] = -1; } } q.Enqueue(new Pos(pi, pj)); dist[pi, pj] = 0; while (q.Count > 0) { Pos p = q.Dequeue(); int d = dist[p.i, p.j]+1; BfsMove(p.i - 1, p.j, d); BfsMove(p.i + 1, p.j, d); BfsMove(p.i, p.j - 1, d); BfsMove(p.i, p.j + 1, d); } } private string moves; private void CheckMove(int i, int j, string dir) { if (i < 0 || i >= Size || j < 0 || j >= Size) return; if (field[i][j] == '4' || field[i][j] == '2') return; moves += dir; } private int myi,myj,foi,foj; // координаты игрока и противника private void LoadState() { int i, j; // загрузка текущего состояния for (i = 0; i < Size; i++) { string s; do { s = Console.ReadLine(); } while (s.Length < Size); field[i] = s; for (j = 0; j < Size; j++) { if (field[i][j] == '3') { myi = i; myj = j; } else if (field[i][j] == '4') { foi = i; foj = j; } } } } Random rnd; private char DoMove() { // здесь можно вызвать функцию CalcArea() // после этого area[i,j] будет содержать размер связной области, включающей i,j // если клетка уже окрашена, то area[i,j]==0 // для поиска пути можно вызвать функцию Bfs(pi,pj) // dist[myi,myj] будет содержать расстояние до указанной позиции // если dist[myi,myj]=-1, то дойти по свободным клеткам ('.','1','3') до указанной позиции невозможно // для перехода по кратчайшему пути выбираем соседнюю клетку с dist[i,j]==dist[myi,myj]-1 moves = ""; CheckMove(myi - 1, myj, "U"); CheckMove(myi + 1, myj, "D"); CheckMove(myi, myj - 1, "L"); CheckMove(myi, myj + 1, "R"); if (moves.Length == 0) moves = "LRDU"; return moves[rnd.Next(moves.Length)]; } private void PrintMove(char a) { Console.WriteLine(a); Console.WriteLine(); } public void Run() { rnd = new Random(); while (true) { LoadState(); PrintMove(DoMove()); } } static void Main(string[] args) { new Program().Run(); } } }