Блог пользователя Fox235

Автор Fox235, 13 лет назад, По-русски

Привет, Всем!
Хотел бы попросить совета (помощи) по данной задачке. Ошибка выдается в тесте №12. Попытался  добить 7 (урезанных строк) разными вариантами, но все равно ошибка выдается.   Код ниже:
static void Main(string[] args)
        {
           // StreamReader ttt = new StreamReader("C:\\1.txt");
            String[] sInput = Console.ReadLine().Split(' ');
            int iY = Convert.ToInt32(sInput[0]);
            int iX = Convert.ToInt32(sInput[1]);
            int iK = Convert.ToInt32(sInput[2]);
            String[] iDataLab = new String[iY];
            int iMaxData = -1;           

            for (int i = 0; i < iY; i++)
                iDataLab[i] = Console.ReadLine();

            String iCommand = Console.ReadLine();

            int[,] bArrayRoom = new int[iY, iX];
            for (int i = 0; i < iY; i++)
            {
                for (int j = 0; j < iX; j++)
                {
                    switch (iDataLab[i][j])
                    {
                        case '#':
                            bArrayRoom[i, j] = 0;
                            break;
                        case '.':
                            bArrayRoom[i, j] = 1;
                            break;
                        case 'E':
                            bArrayRoom[i, j] = 2;
                            break;
                    }
                }
            }

            int[,] bCommandStep = new int[iCommand.Length, 2];
            for (int i = 0; i < iCommand.Length; i++)
            {
                switch (iCommand[i])
                {
                    case 'U':
                        bCommandStep[i, 0] = -1;
                        bCommandStep[i, 1] = 0;
                        break;
                    case 'D':
                        bCommandStep[i, 0] = 1;
                        bCommandStep[i, 1] = 0;
                        break;
                    case 'L':
                        bCommandStep[i, 0] = 0;
                        bCommandStep[i, 1] = -1;
                        break;
                    case 'R':
                        bCommandStep[i, 0] = 0;
                        bCommandStep[i, 1] = 1;
                        break;
                }
            }
            int iIndex = 0;
            int iCurX = 0;
            int iCurY = 0;
            bool bNotStep = false;

            for (int iBeginY = 0; iBeginY < iY && !bNotStep; iBeginY++)
            {
                for (int iBeginX = 0; iBeginX < iX && !bNotStep; iBeginX++)
                {
                    switch (bArrayRoom[iBeginY, iBeginX])
                    {
                        case 0:
                            break;
                        case 1:
                            iCurX = iBeginX;
                            iCurY = iBeginY;
                            iIndex = 0;
                            bNotStep = true;                    
                            for (int i = 0; i < iCommand.Length; i++)
                            {
                                iCurY += bCommandStep[i, 0];
                                iCurX += bCommandStep[i, 1];
                                if (iCurY < 0 || iCurY > iY - 1 || bArrayRoom[iCurY, iCurX] == 0)
                                    iCurY -= bCommandStep[i, 0];

                                if (iCurX < 0 || iCurX > iX - 1 || bArrayRoom[iCurY, iCurX] == 0)
                                    iCurX -= bCommandStep[i, 1];
                                iIndex++;

                                if (bArrayRoom[iCurY, iCurX] == 2)
                                {
                                    bNotStep = false;
                                    if (iIndex > iMaxData)
                                        iMaxData = iIndex;
                                    break;
                                }
                            }
                            break;
                        case 2:
                            bNotStep = false;
                            if (iIndex > iMaxData)
                                iMaxData = iIndex;
                            break;
                    }
                }
            }
            if (bNotStep)
                iMaxData = -1;
            Console.WriteLine(iMaxData);
        }

Всем Спасибо за внимание!!!

  • Проголосовать: нравится
  • +7
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вообще, я бы для начала посоветовал Вам посмотреть чужие решения. Тем более, я считаю, понимать C++ или Яву Вы обязаны.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +9 Проголосовать: не нравится
    Спасибо за совет. Но, прежде чем опубликовать проблему, я порылся в чужих решениях. Мне это не помогло, поэтому обратился к помощи тут.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Возможно, в случае, когда данная последовательность приводит к выходу не из всех клеток, у Вас выводится не -1, а максимальная длина пути до выхода.

Замените во втором тестовом примере правую нижнюю точку на # и проверьте. Правильный ответ -1.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Спасибо, за предположение. Но, к сожалению, нет. Выдается верный ответ = -1.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А да, я проглядел, что у Вас обход сначала по строкам...
      Попробуйте такой тест:
      5 3 1
      ###
      #.#
      #E#
      #.#
      ###
      U
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
По-моему дело все в том, что недостаточно просто выбирать наибольший префикс среди всех, которые приводят к выходу. например интересно было бы посмотреть, что будет выведено на тест

3 5 4
#####
#.E.#
#####
LLRR

Ответ должен быть -1

P.S. вообще ваше решение может не пройти по времени. по крайней мере в разборе так было написано :)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вы наверное пропустили это предложение в условии:

"Другими словами, робот должен оказаться в клетке выхода после выполнения всех команд из префикса (в процессе выполнения команд робот мог приходить в клетку выхода, а затем уходить из нее, но нас интересует положение робота только в самом конце), где бы он ни находился в подвале изначально."

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
В задаче имеется в виду, что нужно найти такой префикс строки команд, что, какую бы начальную точку мы не выбрали, выполнив все команды из этого префикса, мы окажемся в точке выхода. И нам не важно, были ли мы в какой-то момент выполнения команд в этой точке.

В первом тесте произойдёт следующее:
UU где бы мы ни были, мы перейдём в самую верхнюю строку
LL где бы мы ни были, мы перейдём в самый левый столбец
и мы окажемся в левом верхнем углу. Тогда будет достаточно просто спуститься вниз и мы вышли.
Значит команда UULLDD из любой клетки приведёт нас к выходу и ответ на семпл - 6
13 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Прошу прощения. Я не правильный тест привёл. там и правда ответ 3 ( я проверил на своей программе ). Вот такой тест должен был бы выявить ошибку:

3 5 2
#####
#.E.#
#####
LR

и вот здесь как бы ответ -1. Потому что из каждой клетки мы попадаем в E, но не одновременно