Выход за пределы массива(не тривиальный случай)

Рейтинг: 0Ответов: 1Опубликовано: 18.04.2015

Здравствуйте, пишу программу, которая считывает из файла input.txt матрицу пример input.txt:

1 1 0 0 1 1 0 0 1 1 1
1 1 0 0 1 1 0 1 1 1 1
1 1 0 0 1 1 0 0 1 1 1
1 0 1 0 1 0 1 0 1 1 1

И находит в матрице количество фигур(0 - пусто не 0 - фигура) Фигуры соединяются во всех направлениях(т.е в примере 3 фигуры) реализовал алгоритм в коде, но внезапно выдает exeption OutOfRange( в строке где if (matrixFromFile2D[i, k] != 0 && ..)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

//Программа находит количество фигур в массиве( пустота обозначается 0)


namespace NumberOfSpots
{
    class Program
    {

        static string inputFile = @"./input.txt";
        static string outputFile = @"./output.txt";

        static void Main(string[] args)
        {
            String matrixFromFileString = File.ReadAllText(inputFile, Encoding.Default);
            matrixFromFileString = matrixFromFileString.Replace("\r", "");

            int linesCount = File.ReadAllLines(inputFile, Encoding.Default).Count();
            int columnsCount = File.ReadLines(inputFile, Encoding.Default).Take(1).First().Split(' ').Count();

            byte[,] matrixFromFile2D = new byte[linesCount + 2, columnsCount + 2];

            int a = 0, b = 0;

            foreach (var line in matrixFromFileString.Split('\n'))
            {
                b = 0;
                foreach (var element in line.Split(' '))
                {
                    matrixFromFile2D[a + 1, b + 1] = Convert.ToByte(element);
                    b++;
                }
                a++;
            }

            for (int i = 0; i < linesCount + 2; i++)
            {
                for (int k = 0; k < columnsCount + 2; k++)
                {
                    Console.Write(matrixFromFile2D[i, k]);
                }
                Console.WriteLine();
            }
            int iteration = 0;
            byte numberOfSpot = 1;
            for (int i = 1; i < linesCount - 1; i++)
            {
                for (int k = 1; k < columnsCount - 1; k++)
                {
                    if (matrixFromFile2D[i, k] != 0 && (matrixFromFile2D[k - 1, i - 1] != 0 || matrixFromFile2D[k, i - 1] != 0 ||
                         matrixFromFile2D[k + 1, i - 1] != 0 || matrixFromFile2D[k + 1, i] != 0 ||
                         matrixFromFile2D[k + 1, i + 1] != 0 || matrixFromFile2D[k, i + 1] != 0 ||
                         matrixFromFile2D[k - 1, i + 1] != 0 || matrixFromFile2D[k - 1, i] != 0))
                    {
                        matrixFromFile2D[i, k] = numberOfSpot;
                    }
                    else
                    {
                        if (matrixFromFile2D[i, k - 1] != 0)
                        {
                            numberOfSpot++;
                        }
                    }
                    iteration++;
                    Console.WriteLine("=========итерация {0} ==========", iteration);
                    for (int t = 0; t < linesCount + 2; t++)
                    {
                        for (int p = 0; p < columnsCount + 2; p++)
                        {
                            Console.Write(matrixFromFile2D[t, p]);
                        }
                        Console.WriteLine();
                    }
                }
            }
            Console.WriteLine("Количество пятен: {0}", numberOfSpot);
            Console.ReadKey();

        }
    }
}

Не могу разобраться,помогите, пожалуйста

Ответы

▲ 3Принят

Напутали с переменными, отвечающими за номер строки и номер столбца. Изначально i отвечает за номер строки, потом - за номер столбца. Очевидно, что этот код будет корректно работать только когда матрица квадратная.

if (matrixFromFile2D[i, k] != 0 && (matrixFromFile2D[k - 1, i - 1] != 0 || matrixFromFile2D[k, i - 1] != 0 ||
    matrixFromFile2D[k + 1, i - 1] != 0 || matrixFromFile2D[k + 1, i] != 0 ||
    matrixFromFile2D[k + 1, i + 1] != 0 || matrixFromFile2D[k, i + 1] != 0 ||
    matrixFromFile2D[k - 1, i + 1] != 0 || matrixFromFile2D[k - 1, i] != 0))
{
    matrixFromFile2D[i, k] = numberOfSpot;
}