Подсчет кол-ва кораблей на поле морского боя - C#

Узнай цену своей работы

Формулировка задачи:

Имеется задача: Подсчитать кол-во кораблей каждого типа на поле из файла input. Где первая строка - размер поля (NxN), "#" - часть корабля, а "." - пустая клетка. В output надо вывести результат (<вид_корабля>.<кол-во>). Дошел до момента, когда у меня есть список верных точек. Как из этого сгруппировать их в корабли? Или мб есть еще более простой и быстрый способ решения? Хранятся координаты в листе массивов ([0] = x, [1] = y); Все, что нарешал. input:
10
....###..#
.........#
###......#
.....#...#
#..#......
#..#.....#
..........
#.........
..........
......#...
static void Main(string[] args)
        {
            StreamReader sr = new StreamReader("input.txt");
            int count = Int32.Parse(sr.ReadLine()),
                                num = 0;
            char[,] data = new char[count, count];
            List<int[]> ships = new List<int[]>();
            bool exit = false;
 
            while (!sr.EndOfStream && exit == false)
            {
                string line = sr.ReadLine();
                for (int i = 0; i < count; i++)
                {
                    data[num, i] = line[i];
                    if (data[num, i] == '#')
                    {
                        int[] cur_ship = new int[] { num, i };
                        if (ships.Count > 1)
                        {
                            for (int k = 0; k < ships.Count; k++)
                            {
                                if (Corrected(ships[ships.Count - 1], ships[k]) == false)
                                {
                                    exit = true;
                                }
                            }
                        }
                        ships.Add(cur_ship);
                        Console.WriteLine("Ship founded");
                        Console.WriteLine("x={0}, y={1}", num.ToString(), i.ToString());
 
                    }
                }
                num++;
                if (num > count) break;
            }
            if (exit) Console.WriteLine("INPUT_ERROR");
            else {
                for (int i = 0; i < ships.Count; i++)
                {
                    for (int j = i+1; j < ships.Count; j++)
                    {
                        if ((ships[i][0] == ships[j][0] && Math.Abs(ships[i][1] - ships[j][1]) == 1) ||
                            (ships[i][1] == ships[j][1] && Math.Abs(ships[i][0] - ships[j][0]) == 1))
                        {
                            Console.WriteLine("From x={0};y={1} to x={2};y={3}", ships[i][0], ships[i][1], ships[j][0], ships[j][1]);
                        }   
                    }
                }
            }
            Console.ReadLine();
        }
 
        static bool Corrected(int[] part1, int[] part2)
        {
            int x1 = part1[0],
                y1 = part1[1],
                x2 = part2[0],
                y2 = part2[1];
 
            if (((x1 == x2 - 1) && //
                ((y1 == y2 - 1) || //  [x1-1,y1-1]           [x1+1,y1-1]
                (y1 == y2 + 1))) || //               [x1,y1]
                ((x1 == x2 + 1) && //  [x1-1,y1+1]           [x1+1,y1+1]
                ((y1 == y2 - 1) || //
                (y1 == y2 + 1))))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

Решение задачи: «Подсчет кол-ва кораблей на поле морского боя»

textual
Листинг программы
   public class BattleField
    {
        private bool[][] _battleField;
 
        public BattleField(bool[][] battleField)
        {
            _battleField = battleField;
        }
 
        public IDictionary<int, int> GetShipCount()
        {
            var result = new Dictionary<int, int>();
            for (var i = 0; i < _battleField.Length; i++)
            {
                for (var j = 0; j < _battleField[i].Length; j++)
                    if (_battleField[i][j])
                    {
                        var count = GetShipSize(i, j);
                        if (!result.ContainsKey(count)) result[count] = 0;
                        result[count]++;
                    }
            }
 
            return result;
        }
 
        public int GetShipSize(int i, int j)
        {
            var result = _battleField[i][j] ? 1 : 0;
            _battleField[i][j] = false;
            if (j < _battleField[i].Length - 1 && i < _battleField.Length - 1 && _battleField[i + 1][j + 1]
                && !_battleField[i][j + 1] && !_battleField[i + 1][j])
                throw new Exception("invalid input "+(i+1)+" "+(j+1));
 
            if (j > 0 && i < _battleField.Length-1 && !_battleField[i][j-1] && !_battleField[i+1][j] && _battleField[i+1][j-1])
              throw new Exception("invalid input "+(i+1)+" "+(j-1));
 
            if (j < _battleField[i].Length-1 && _battleField[i][j + 1])
            {
                result += GetShipSize(i, j + 1);
            }
 
            if (i < _battleField.Length-1 && _battleField[i + 1][j])
            {
                result += GetShipSize(i + 1, j);
            }
 
            if (j > 0 && _battleField[i][j - 1])
            {
                result += GetShipSize(i, j - 1);
            }
 
           
            return result;
 
            
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы