private SalaQuadrada[,] Resolver(int[] tamanho, string caminhoIda, string caminhoVolta)
        {
            Direcao direcaoAtual = Direcao.Baixo;
            SalaQuadrada[,] salao = new SalaQuadrada[tamanho[0], tamanho[1]];
            //O eixoX pode ficar negativo, entao soma-se o limite esquerdo, é o eixo inicial em X
            int eixoX = tamanho[2];
            if (eixoX < 0)
                eixoX *= -1;
            int eixoY = 0;

            //Não conta o primeiro e ultimo comando, pois é do lado de fora do labirinto
            for (int i = 1; i < caminhoIda.Length; i++)
            {
                if (eixoX == 1 && eixoY == 3)
                    Console.Write("");

                //Inicializacao
                if (salao[eixoX, eixoY] == null)
                    salao[eixoX, eixoY] = new SalaQuadrada();

                //Primeiro muda a direcao pra saber qual a direcao que ele esta virando
                direcaoAtual = MudaDirecao(direcaoAtual, caminhoIda[i]);

                if (caminhoIda[i] == 'L')
                {
                    if (direcaoAtual == Direcao.Esquerda)
                        salao[eixoX, eixoY].EsquerdaAberta = true;
                    else if (direcaoAtual == Direcao.Direita)
                        salao[eixoX, eixoY].DireitaAberta = true;
                    else if (direcaoAtual == Direcao.Cima)
                        salao[eixoX, eixoY].AcimaAberta = true;
                    else if (direcaoAtual == Direcao.Baixo)
                        salao[eixoX, eixoY].AbaixoAberta = true;
                }
                else if (caminhoIda[i] == 'R')
                {
                    //Verifica se ele anda depois do R ou faz outro R, se fizer outro R ignora
                    if (caminhoIda[i + 1] == 'W')
                    {
                        if (direcaoAtual == Direcao.Esquerda)
                        {
                            salao[eixoX, eixoY].EsquerdaAberta = true;
                            salao[eixoX, eixoY].AbaixoAberta = false;
                            salao[eixoX, eixoY].DireitaAberta = false;
                        }
                        else if (direcaoAtual == Direcao.Direita)
                        {
                            salao[eixoX, eixoY].DireitaAberta = true;
                            salao[eixoX, eixoY].AcimaAberta = false;
                            salao[eixoX, eixoY].EsquerdaAberta = false;
                        }
                        else if (direcaoAtual == Direcao.Cima)
                        {
                            salao[eixoX, eixoY].AcimaAberta = true;
                            salao[eixoX, eixoY].EsquerdaAberta = false;
                            salao[eixoX, eixoY].AbaixoAberta = false;
                        }
                        else if (direcaoAtual == Direcao.Baixo)
                        {
                            salao[eixoX, eixoY].AbaixoAberta = true;
                            salao[eixoX, eixoY].AcimaAberta = false;
                            salao[eixoX, eixoY].DireitaAberta = false;
                        }
                    }
                }

                if (caminhoIda[i] == 'W')
                {
                    if (direcaoAtual == Direcao.Esquerda)
                    {
                        salao[eixoX, eixoY].EsquerdaAberta = true;
                        //Salao[eixoX, eixoY].AbaixoAberta = false;
                        eixoX--;
                    }
                    else if (direcaoAtual == Direcao.Direita)
                    {
                        salao[eixoX, eixoY].DireitaAberta = true;
                        //Salao[eixoX, eixoY].AcimaAberta = false;
                        eixoX++;
                    }
                    else if (direcaoAtual == Direcao.Cima)
                    {
                        salao[eixoX, eixoY].AcimaAberta = true;
                        //Salao[eixoX, eixoY].EsquerdaAberta = false;
                        eixoY--;
                    }
                    else if (direcaoAtual == Direcao.Baixo)
                    {
                        salao[eixoX, eixoY].AbaixoAberta = true;
                        //Salao[eixoX, eixoY].DireitaAberta = false;
                        eixoY++;
                    }
                }
            }

            //Caminho de volta
            //Inverte a direcao
            direcaoAtual = MudaDirecao(direcaoAtual, 'R');
            direcaoAtual = MudaDirecao(direcaoAtual, 'R');

            //Volta pra dentro do labirinto
            if (direcaoAtual == Direcao.Esquerda)
            {
                eixoX--;
            }
            else if (direcaoAtual == Direcao.Direita)
            {
                eixoX++;
            }
            else if (direcaoAtual == Direcao.Cima)
            {
                eixoY--;
            }
            else if (direcaoAtual == Direcao.Baixo)
            {
                eixoY++;
            }

            //Não conta o primeiro e ultimo comando, pois é do lado de fora do labirinto
            for (int i = 1; i < caminhoVolta.Length; i++)
            {
                if (eixoX == 1 && eixoY == 3)
                    Console.Write("");

                if (eixoY > -1 && eixoX > -1)
                {

                    //Inicializacao
                    if (salao[eixoX, eixoY] == null)
                        salao[eixoX, eixoY] = new SalaQuadrada();

                    //Primeiro muda a direcao pra saber qual a direcao que ele esta virando
                    direcaoAtual = MudaDirecao(direcaoAtual, caminhoVolta[i]);

                    if (caminhoVolta[i] == 'L')
                    {
                        if (direcaoAtual == Direcao.Esquerda)
                            salao[eixoX, eixoY].EsquerdaAberta = true;
                        else if (direcaoAtual == Direcao.Direita)
                            salao[eixoX, eixoY].DireitaAberta = true;
                        else if (direcaoAtual == Direcao.Cima)
                            salao[eixoX, eixoY].AcimaAberta = true;
                        else if (direcaoAtual == Direcao.Baixo)
                            salao[eixoX, eixoY].AbaixoAberta = true;
                    }
                    else if (caminhoVolta[i] == 'R')
                    {
                        //Verifica se ele anda depois do R ou faz outro R, se fizer outro R ignora
                        if (caminhoVolta[i + 1] == 'W')
                        {
                            if (direcaoAtual == Direcao.Esquerda)
                            {
                                salao[eixoX, eixoY].EsquerdaAberta = true;
                                salao[eixoX, eixoY].AbaixoAberta = false;
                                salao[eixoX, eixoY].DireitaAberta = false;
                            }
                            else if (direcaoAtual == Direcao.Direita)
                            {
                                salao[eixoX, eixoY].DireitaAberta = true;
                                salao[eixoX, eixoY].AcimaAberta = false;
                                salao[eixoX, eixoY].EsquerdaAberta = false;
                            }
                            else if (direcaoAtual == Direcao.Cima)
                            {
                                salao[eixoX, eixoY].AcimaAberta = true;
                                salao[eixoX, eixoY].EsquerdaAberta = false;
                                salao[eixoX, eixoY].AbaixoAberta = false;
                            }
                            else if (direcaoAtual == Direcao.Baixo)
                            {
                                salao[eixoX, eixoY].AbaixoAberta = true;
                                salao[eixoX, eixoY].AcimaAberta = false;
                                salao[eixoX, eixoY].DireitaAberta = false;
                            }
                        }
                    }

                    if (caminhoVolta[i] == 'W')
                    {
                        if (direcaoAtual == Direcao.Esquerda)
                        {
                            salao[eixoX, eixoY].EsquerdaAberta = true;
                            //Salao[eixoX, eixoY].AbaixoAberta = false;
                            eixoX--;
                        }
                        else if (direcaoAtual == Direcao.Direita)
                        {
                            salao[eixoX, eixoY].DireitaAberta = true;
                            //Salao[eixoX, eixoY].AcimaAberta = false;
                            eixoX++;
                        }
                        else if (direcaoAtual == Direcao.Cima)
                        {
                            salao[eixoX, eixoY].AcimaAberta = true;
                            //Salao[eixoX, eixoY].EsquerdaAberta = false;
                            eixoY--;
                        }
                        else if (direcaoAtual == Direcao.Baixo)
                        {
                            salao[eixoX, eixoY].AbaixoAberta = true;
                            //Salao[eixoX, eixoY].DireitaAberta = false;
                            eixoY++;
                        }
                    }
                }
                else
                {
                    if (eixoY == -1)
                        eixoY = 0;
                    else
                        eixoX = 0;
                }
            }

            return salao;
        }
Example #2
0
        private SalaQuadrada[,] Resolver(int[] tamanho, string caminhoIda, string caminhoVolta)
        {
            Direcao direcaoAtual = Direcao.Baixo;

            SalaQuadrada[,] salao = new SalaQuadrada[tamanho[0], tamanho[1]];
            //O eixoX pode ficar negativo, entao soma-se o limite esquerdo, é o eixo inicial em X
            int eixoX = tamanho[2];

            if (eixoX < 0)
            {
                eixoX *= -1;
            }
            int eixoY = 0;

            //Não conta o primeiro e ultimo comando, pois é do lado de fora do labirinto
            for (int i = 1; i < caminhoIda.Length; i++)
            {
                if (eixoX == 1 && eixoY == 3)
                {
                    Console.Write("");
                }

                //Inicializacao
                if (salao[eixoX, eixoY] == null)
                {
                    salao[eixoX, eixoY] = new SalaQuadrada();
                }

                //Primeiro muda a direcao pra saber qual a direcao que ele esta virando
                direcaoAtual = MudaDirecao(direcaoAtual, caminhoIda[i]);

                if (caminhoIda[i] == 'L')
                {
                    if (direcaoAtual == Direcao.Esquerda)
                    {
                        salao[eixoX, eixoY].EsquerdaAberta = true;
                    }
                    else if (direcaoAtual == Direcao.Direita)
                    {
                        salao[eixoX, eixoY].DireitaAberta = true;
                    }
                    else if (direcaoAtual == Direcao.Cima)
                    {
                        salao[eixoX, eixoY].AcimaAberta = true;
                    }
                    else if (direcaoAtual == Direcao.Baixo)
                    {
                        salao[eixoX, eixoY].AbaixoAberta = true;
                    }
                }
                else if (caminhoIda[i] == 'R')
                {
                    //Verifica se ele anda depois do R ou faz outro R, se fizer outro R ignora
                    if (caminhoIda[i + 1] == 'W')
                    {
                        if (direcaoAtual == Direcao.Esquerda)
                        {
                            salao[eixoX, eixoY].EsquerdaAberta = true;
                            salao[eixoX, eixoY].AbaixoAberta   = false;
                            salao[eixoX, eixoY].DireitaAberta  = false;
                        }
                        else if (direcaoAtual == Direcao.Direita)
                        {
                            salao[eixoX, eixoY].DireitaAberta  = true;
                            salao[eixoX, eixoY].AcimaAberta    = false;
                            salao[eixoX, eixoY].EsquerdaAberta = false;
                        }
                        else if (direcaoAtual == Direcao.Cima)
                        {
                            salao[eixoX, eixoY].AcimaAberta    = true;
                            salao[eixoX, eixoY].EsquerdaAberta = false;
                            salao[eixoX, eixoY].AbaixoAberta   = false;
                        }
                        else if (direcaoAtual == Direcao.Baixo)
                        {
                            salao[eixoX, eixoY].AbaixoAberta  = true;
                            salao[eixoX, eixoY].AcimaAberta   = false;
                            salao[eixoX, eixoY].DireitaAberta = false;
                        }
                    }
                }

                if (caminhoIda[i] == 'W')
                {
                    if (direcaoAtual == Direcao.Esquerda)
                    {
                        salao[eixoX, eixoY].EsquerdaAberta = true;
                        //Salao[eixoX, eixoY].AbaixoAberta = false;
                        eixoX--;
                    }
                    else if (direcaoAtual == Direcao.Direita)
                    {
                        salao[eixoX, eixoY].DireitaAberta = true;
                        //Salao[eixoX, eixoY].AcimaAberta = false;
                        eixoX++;
                    }
                    else if (direcaoAtual == Direcao.Cima)
                    {
                        salao[eixoX, eixoY].AcimaAberta = true;
                        //Salao[eixoX, eixoY].EsquerdaAberta = false;
                        eixoY--;
                    }
                    else if (direcaoAtual == Direcao.Baixo)
                    {
                        salao[eixoX, eixoY].AbaixoAberta = true;
                        //Salao[eixoX, eixoY].DireitaAberta = false;
                        eixoY++;
                    }
                }
            }

            //Caminho de volta
            //Inverte a direcao
            direcaoAtual = MudaDirecao(direcaoAtual, 'R');
            direcaoAtual = MudaDirecao(direcaoAtual, 'R');

            //Volta pra dentro do labirinto
            if (direcaoAtual == Direcao.Esquerda)
            {
                eixoX--;
            }
            else if (direcaoAtual == Direcao.Direita)
            {
                eixoX++;
            }
            else if (direcaoAtual == Direcao.Cima)
            {
                eixoY--;
            }
            else if (direcaoAtual == Direcao.Baixo)
            {
                eixoY++;
            }

            //Não conta o primeiro e ultimo comando, pois é do lado de fora do labirinto
            for (int i = 1; i < caminhoVolta.Length; i++)
            {
                if (eixoX == 1 && eixoY == 3)
                {
                    Console.Write("");
                }

                if (eixoY > -1 && eixoX > -1)
                {
                    //Inicializacao
                    if (salao[eixoX, eixoY] == null)
                    {
                        salao[eixoX, eixoY] = new SalaQuadrada();
                    }

                    //Primeiro muda a direcao pra saber qual a direcao que ele esta virando
                    direcaoAtual = MudaDirecao(direcaoAtual, caminhoVolta[i]);

                    if (caminhoVolta[i] == 'L')
                    {
                        if (direcaoAtual == Direcao.Esquerda)
                        {
                            salao[eixoX, eixoY].EsquerdaAberta = true;
                        }
                        else if (direcaoAtual == Direcao.Direita)
                        {
                            salao[eixoX, eixoY].DireitaAberta = true;
                        }
                        else if (direcaoAtual == Direcao.Cima)
                        {
                            salao[eixoX, eixoY].AcimaAberta = true;
                        }
                        else if (direcaoAtual == Direcao.Baixo)
                        {
                            salao[eixoX, eixoY].AbaixoAberta = true;
                        }
                    }
                    else if (caminhoVolta[i] == 'R')
                    {
                        //Verifica se ele anda depois do R ou faz outro R, se fizer outro R ignora
                        if (caminhoVolta[i + 1] == 'W')
                        {
                            if (direcaoAtual == Direcao.Esquerda)
                            {
                                salao[eixoX, eixoY].EsquerdaAberta = true;
                                salao[eixoX, eixoY].AbaixoAberta   = false;
                                salao[eixoX, eixoY].DireitaAberta  = false;
                            }
                            else if (direcaoAtual == Direcao.Direita)
                            {
                                salao[eixoX, eixoY].DireitaAberta  = true;
                                salao[eixoX, eixoY].AcimaAberta    = false;
                                salao[eixoX, eixoY].EsquerdaAberta = false;
                            }
                            else if (direcaoAtual == Direcao.Cima)
                            {
                                salao[eixoX, eixoY].AcimaAberta    = true;
                                salao[eixoX, eixoY].EsquerdaAberta = false;
                                salao[eixoX, eixoY].AbaixoAberta   = false;
                            }
                            else if (direcaoAtual == Direcao.Baixo)
                            {
                                salao[eixoX, eixoY].AbaixoAberta  = true;
                                salao[eixoX, eixoY].AcimaAberta   = false;
                                salao[eixoX, eixoY].DireitaAberta = false;
                            }
                        }
                    }

                    if (caminhoVolta[i] == 'W')
                    {
                        if (direcaoAtual == Direcao.Esquerda)
                        {
                            salao[eixoX, eixoY].EsquerdaAberta = true;
                            //Salao[eixoX, eixoY].AbaixoAberta = false;
                            eixoX--;
                        }
                        else if (direcaoAtual == Direcao.Direita)
                        {
                            salao[eixoX, eixoY].DireitaAberta = true;
                            //Salao[eixoX, eixoY].AcimaAberta = false;
                            eixoX++;
                        }
                        else if (direcaoAtual == Direcao.Cima)
                        {
                            salao[eixoX, eixoY].AcimaAberta = true;
                            //Salao[eixoX, eixoY].EsquerdaAberta = false;
                            eixoY--;
                        }
                        else if (direcaoAtual == Direcao.Baixo)
                        {
                            salao[eixoX, eixoY].AbaixoAberta = true;
                            //Salao[eixoX, eixoY].DireitaAberta = false;
                            eixoY++;
                        }
                    }
                }
                else
                {
                    if (eixoY == -1)
                    {
                        eixoY = 0;
                    }
                    else
                    {
                        eixoX = 0;
                    }
                }
            }

            return(salao);
        }
        private void EscreverSaida(SalaQuadrada[,] salao, int contagem, string caminhoSaida)
        {
            using (StreamWriter saida = new StreamWriter(caminhoSaida, true))
            {
                saida.WriteLine("Case #" + contagem.ToString() + ":");

                for (int i = 0; i < salao.GetLength(1); i++)
                {
                    for (int x = 0; x < salao.GetLength(0); x++)
                    {
                        if (i == 3 && x == 0)
                            Console.Write("");

                        int valorSaida = 0;
                        if (salao[x, i].AcimaAberta.HasValue && salao[x, i].AcimaAberta.Value)
                            valorSaida += 1;
                        if (salao[x, i].AbaixoAberta.HasValue && salao[x, i].AbaixoAberta.Value)
                            valorSaida += 2;
                        if (salao[x, i].EsquerdaAberta.HasValue && salao[x, i].EsquerdaAberta.Value)
                            valorSaida += 4;
                        if (salao[x, i].DireitaAberta.HasValue && salao[x, i].DireitaAberta.Value)
                            valorSaida += 8;

                        char charSaida = valorSaida.ToString("x")[0];

                        saida.Write(charSaida);
                    }
                    saida.WriteLine();
                }
                saida.Close();
            }
        }