Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com programa [2]


dfop02

Pergunta

17202883_258239174631561_720759810575516

17191269_258239541298191_109185632894891

 

Essa é a questão, eu fiz o seguinte até o momento:

# -*- coding: utf-8 -*-
from __future__ import print_function

tam = []
mapa = []
print("Digite a quantidade de colunas e linhas, respectivamente:")
valores = raw_input()
partes = valores.split()

tam.append(int(partes[0]))
tam.append(int(partes[1]))

mapa = []
for i in range(tam[1]):
    mapa.append(raw_input())

    lin = []
    col = []
    icones = ['.', '>', '<', '^', 'v', '*']
    if mapa.append() != '>' or '<' or '^' or 'v' or '.' or '*':
        print("Somente os caracteres abaixo são permitidos")
        print(icones)
        mapa.remove(-1)

while icones != '*' and icones != '.':
    if icones == '>':
        if mapa[1][0] == 'v':
            icones = 'v'
        if mapa[1][0] == '<':
            icones = '<'
        if mapa[1][0] == '^':
            icones = '^'
        if mapa[1][0] == '*':
            icones = '*'
        if (mapa[1][0] == '>' or mapa[1][col] == '.') and col == len(mapa[1]):
            icones = '.'
        if (mapa[1][0] == '>' or mapa[1][col] == '.') and col < len(mapa[1]):
            col += 1
    if icones == '<':
        if mapa[1][0] == 'v':
            icones = 'v'
        if mapa[1][0] == '>':
            icones = '>'
        if mapa[1][0] == '^':
            icones = '^'
        if mapa[1][0] == '*':
            icones = '*'
        if (mapa[1][0] == '<' or mapa[1][col] == '.') and col == len(mapa[1]):
            icones = '.'
        if (mapa[1][0] == '<' or mapa[1][col] == '.') and col < len(mapa[1]):
            col += -1
    if icones == '^':
        if mapa[1][0] == 'v':
            icones = 'v'
        if mapa[1][0] == '>':
            icones = '>'
        if mapa[1][0] == '>':
            icones = '>'
        if mapa[1][0] == '*':
            icones = '*'
        if (mapa[1][0] == '^' or mapa[1][col] == '.') and col == len(mapa[1]):
            icones = '.'
        if (mapa[1][0] == '^' or mapa[1][col] == '.') and col < len(mapa[1]):
            lin += -1
    if icones == 'v':
        if mapa[1][0] == '^':
            icones = '^'
        if mapa[1][0] == '>':
            icones = '>'
        if mapa[1][0] == '>':
            icones = '>'
        if mapa[1][0] == '*':
            icones = '*'
        if (mapa[1][0] == 'v' or mapa[1][col] == '.') and col == len(mapa[1]):
            icones = '.'
        if (mapa[1][0] == 'v' or mapa[1][col] == '.') and col < len(mapa[1]):
            lin += 1
    if icones == '*':
        print("Esse mapa leva ao tesouro")
        break
    else:
        print("Esse mapa não leva a lugar nenhum")
      	break

Alguém pode me ajudar?? Eu não consigo fazer o código percorrer a linha em busca de outra seta e nem atribuir a ela essa função de verificar outras setas no caminho até achar o "*". Tentei fazer apenas usando while e if mas não deu muito certo =/

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Essa seria minha solução:

direcao = {'<' : ( 0, -1),
           '>' : ( 0,  1),
           '^' : (-1,  0),
           'v' : ( 1,  0),
           '*' : ( 0,  0)}

with open('mapa.txt', 'r') as arquivo:
    entrada = arquivo.readlines()
    
    col, lin = entrada[0].split()
    lin = int(lin)
    col = int(col)
    
    mapa = []
    for linha in entrada[1:]:
        mapa.append([caractere for caractere in linha])
    
    i, j = 0, 0
    
    continuar = True
    locais = []   #locais com ícones de direção já visitados
    if(mapa[0][0] == '.'):  #se o ponto de partida não apontar p/ nenhuma direção
        print('Esse mapa nao leva a lugar algum')
        continuar = False
    else:
        di, dj = direcao[mapa[0][0]]
        locais.append((0, 0))
    
    while continuar:
        #Move na direção indicada:
        i = i + di
        j = j + dj
        
        #Se já passou pelo local desta seta, está andando em círculos:
        if (i, j) in locais:
            print('Esse mapa nao leva a lugar algum')
            continuar = False
            
        #Se ainda estiver dentro do terreno:
        elif i>=0 and i<lin and j>=0 and j<col:
            if mapa[i][j] != '.':
                di, dj = direcao[mapa[i][j]]
                locais.append((i, j))
            if mapa[i][j] == '*':
                print('Esse mapa leva ao tesouro')
                continuar = False
                
        #Se tiver saído do terreno:
        else:
            print('Esse mapa nao leva a lugar algum')
            continuar = False

Aí o mapa de entrada vai num arquivo de texto chamado mapa.txt que deve estar na mesma pasta onde está o programa em Python.

Um exemplo de mapa para colocar no arquivo mapa.txt:

10 10
v......>v.
....>..^..
..........
>...^.....
..........
..........
..v.....<.
..........
..........
..>...*...

 

Editado por isrnick
Link para o comentário
Compartilhar em outros sites

  • 0
2 horas atrás, isrnick disse:

Essa seria minha solução:


direcao = {'<' : ( 0, -1),
           '>' : ( 0,  1),
           '^' : (-1,  0),
           'v' : ( 1,  0),
           '*' : ( 0,  0)}

with open('mapa.txt', 'r') as arquivo:
    entrada = arquivo.readlines()
    
    col, lin = entrada[0].split()
    lin = int(lin)
    col = int(col)
    
    mapa = []
    for linha in entrada[1:]:
        mapa.append([caractere for caractere in linha])
    
    i, j = 0, 0
    
    continuar = True
    locais = []   #locais com ícones de direção já visitados
    if(mapa[0][0] == '.'):  #se o ponto de partida não apontar p/ nenhuma direção
        print('Esse mapa nao leva a lugar algum')
        continuar = False
    else:
        di, dj = direcao[mapa[0][0]]
        locais.append((0, 0))
    
    while continuar:
        #Move na direção indicada:
        i = i + di
        j = j + dj
        
        #Se já passou pelo local desta seta, está andando em círculos:
        if (i, j) in locais:
            print('Esse mapa nao leva a lugar algum')
            continuar = False
            
        #Se ainda estiver dentro do terreno:
        elif i>=0 and i<lin and j>=0 and j<col:
            if mapa[i][j] != '.':
                di, dj = direcao[mapa[i][j]]
                locais.append((i, j))
            if mapa[i][j] == '*':
                print('Esse mapa leva ao tesouro')
                continuar = False
                
        #Se tiver saído do terreno:
        else:
            print('Esse mapa nao leva a lugar algum')
            continuar = False

Aí o mapa de entrada vai num arquivo de texto chamado mapa.txt que deve estar na mesma pasta onde está o programa em Python.

Um exemplo de mapa para colocar no arquivo mapa.txt:


10 10
v......>v.
....>..^..
..........
>...^.....
..........
..........
..v.....<.
..........
..........
..>...*...

 

Valeu mano, eu nunca chegaria nisso sozinho, vou ter que estudar bastante esse codigo, mas um problema é que a entrada precisa ser no próprio Python 3, mas não se preocupe, pois eu consegui adaptar seu codigo para que mesmo receba a entrada ao enves de puxar de um arquivo text.txt

Muito obrigado novamente. Agora vou estudar esse e então só faltará 1 exercicio e vou tentar mais um pouco resolve-lo, se não consegui peço ajuda novamente =)

Só o que está me complicando no último é um jeito de trocar um caracter se "F" se pelo menos um dos 4 visinhos (cima, baixo, esquerda ou direita), for a letra "I". mas sigo tentando kk

Link para o comentário
Compartilhar em outros sites

  • 0

Beleza. Se tiver alguma coisa que não conseguiu entender no meu código posta a dúvida e eu explico.

 

Tem certeza que precisa digitar o mapa inteiro manualmente toda vez que o programa rodar? O enunciado não especifica o modo de entrada, mas esse tipo de Entrada de dados descrita no exercício é o típico tipo de entrada que se usa em arquivos.

Digitando seria muito fácil errar e digitar caracteres a menos ou na posição errada, ficando pior quanto maior for o mapa.

Editado por isrnick
Link para o comentário
Compartilhar em outros sites

  • 0
46 minutos atrás, isrnick disse:

Beleza. Se tiver alguma coisa que não conseguiu entender no meu código posta a dúvida e eu explico.

 

Tem certeza que precisa digitar o mapa inteiro manualmente toda vez que o programa rodar? O enunciado não especifica o modo de entrada, mas esse tipo de Entrada de dados descrita no exercício é o típico tipo de entrada que se usa em arquivos.

Digitando seria muito fácil errar e digitar caracteres a menos ou na posição errada, ficando pior quanto maior for o mapa.

Sobre esse eu li tudo e entendi sim o que você fez, mas nunca conseguiria pensar nisso, ainda preciso aprender muito.

 

Sobre o ultimo exercicio eu realmente não consegui fazer a parte final dele, também é de matriz (Essas de matriz acabaram comigo). Você digita uma entrada em forma de matriz assim:

I   I  I
x  x F
F x F

Basicamente ele deve mudar toda letra F que estiver com uma letra I que encoste nele, em sua horizontal ou vertical.

A saída ficaria assim:
I  I  I
x x I
F x I

Entendeu? eu tentei assim:

from __future__ import print_function

while True:
    print("Digite a quantidade de colunas e linhas, respectivamente:")
    valores = raw_input()
    partes = valores.split()

    N = (int(partes[0]))
    M = (int(partes[1]))

    matriz = []
    icones = ['x', 'I', 'F']
    print("Digite o ambiente do tesouro")
    for i in range(N):
        partes = []
        valores = raw_input()
        partes = valores.split()

        matriz.append(partes[0:])

    for i in matriz:
        for j in i:
            if j != ('x' or 'I' or 'F'):
                None
                #nao funciona =/
                #print("Somente os caracteres abaixo sao permitidos")
                #print(icones[0:])
            else:
                None

    for i in range(M):
        for j in range(N):
            if j == 'F':
                if (j+1 or j-1 or i+1 or i-1) == 'I':
                    matriz[i][j].replace('F', 'I')

    for i in matriz:
        for j in i:
            print(j, end=' ')
        print("")

    if N == 0 and M == 0:
        break

Deve ser algo extremamente simples que errei aí, pode dar uma olhada por favor? Esse é o ultimo, prometo kk

Link para o comentário
Compartilhar em outros sites

  • 0

Primeiramente uma dúvida, N é o número de linhas e M o número de colunas? Se sim tem um problema aqui nesses dois fors um dentro do outro que está assim:

    for i in range(M):
        for j in range(N):

Pois nesse caso M e N estão ao contrário, e deveria ser assim:

    for i in range(N):
        for j in range(M):

 

Mas se esse não for o caso, mas sim M = linhas e N = colunas, o mesmo problema continua mas só muda de lugar, ou seja está lá em cima na parte que a "matriz" é montada onde nesse caso deveria ser M ao invés de N:

    for i in range(N):
        partes = []
        valores = raw_input()
        partes = valores.split()

        matriz.append(partes[0:])

 

 

Segundo, isso aqui não vai funcionar:

            if j == 'F':
                if (j+1 or j-1 or i+1 or i-1) == 'I':
                    matriz[i][j].replace('F', 'I')

Por que aqui i e j são números inteiros, não as letras contidas na matriz, i e j são as posições na matriz. Então, imagino que sua intenção era fazer algo assim:

            if matriz[i][j] == 'F':
                if matriz[i][j+1]=='I' or matriz[i][j-1]=='I' or matriz[i+1][j]=='I' or matriz[i-1][j]=='I':
                    matriz[i][j] = 'I'

 

 

Terceiro, se partir de uma matriz inicial como essa:

F F F F
F F F I
F F F F
F F F F

O resultado final deveria ser este?

F F F I
F F I I
F F I I
F F I I

Ou este?

I I I I
I I I I
I I I I
I I I I

Por que acredito que a lógica atual do seu programa resultará na primeira resposta.

Link para o comentário
Compartilhar em outros sites

  • 0
11 horas atrás, isrnick disse:

Primeiramente uma dúvida, N é o número de linhas e M o número de colunas? Se sim tem um problema aqui nesses dois fors um dentro do outro que está assim:


    for i in range(M):
        for j in range(N):

Pois nesse caso M e N estão ao contrário, e deveria ser assim:


    for i in range(N):
        for j in range(M):

 

Mas se esse não for o caso, mas sim M = linhas e N = colunas, o mesmo problema continua mas só muda de lugar, ou seja está lá em cima na parte que a "matriz" é montada onde nesse caso deveria ser M ao invés de N:


    for i in range(N):
        partes = []
        valores = raw_input()
        partes = valores.split()

        matriz.append(partes[0:])

 

 

Segundo, isso aqui não vai funcionar:


            if j == 'F':
                if (j+1 or j-1 or i+1 or i-1) == 'I':
                    matriz[i][j].replace('F', 'I')

Por que aqui i e j são números inteiros, não as letras contidas na matriz, i e j são as posições na matriz. Então, imagino que sua intenção era fazer algo assim:


            if matriz[i][j] == 'F':
                if matriz[i][j+1]=='I' or matriz[i][j-1]=='I' or matriz[i+1][j]=='I' or matriz[i-1][j]=='I':
                    matriz[i][j] = 'I'

 

 

Terceiro, se partir de uma matriz inicial como essa:


F F F F
F F F I
F F F F
F F F F

O resultado final deveria ser este?


F F F I
F F I I
F F I I
F F I I

Ou este?


I I I I
I I I I
I I I I
I I I I

Por que acredito que a lógica atual do seu programa resultará na primeira resposta.

Primeiro, obrigado mais uma vez!

Vamos lá, N = Linha, M = Coluna (Só deixei essa variavel confusa pois no exercicio pede para declarar elas).

Sobre a parte do i e j, agora eu entendi perfeitamente, estava confuso do pq que não conseguia funciona, pois eu estava tomando como base outras respostas suas, tentei só adaptar, a ideia foi boa mas a execução deixou a desejar né kk

Sobre o final, O resultado deveria ser 

I I I I
I I I I
I I I I
I I I I

Todo F que o I toca, torna-se I (Exceto nas diagonais), e isso se aplica ao F após ele virar I também, até não ter mais opções.

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui fiz as correções, coloquei comentários para explicar as modificações:

from __future__ import print_function

while True:
    print("Digite a quantidade de colunas e linhas, respectivamente:")
    valores = raw_input()
    partes = valores.split()

    N = (int(partes[0]))
    M = (int(partes[1]))
    
    # Coloquei a condicao de parada do programa aqui em cima
    if N == 0 and M == 0:
        break

    matriz = []
    icones = ['x', 'I', 'F']
    print("Digite o ambiente do tesouro")
    for i in range(N):
        partes = []
        valores = raw_input()
        partes = valores.split()

        matriz.append(partes[0:])
        
    print("")

    for i in matriz:
        for j in i:
            # Corrigi essa linha aqui abaixo tambem, compare com o original.
            if j not in icones: 
                print("Somente os caracteres abaixo sao permitidos")
                print(icones)
            else:
                None

    # Na logica abaixo eu mudei para voltar para o comeco da matriz quando
    # algum F for alterado para I, para isso funcionar tive que usar ciclos
    # while ao inves de for:
    i = 0
    while i < N:
        j = 0
        while j < M:
            if matriz[i][j] == 'F':
                # Abaixo eu checo o valor da coordenada i ou j primeiro, para nao
                # usar valores invalidos nos indices da matriz.
                # Ex: matriz[-1][0] nao e valido.
                if i > 0 and matriz[i-1][j]=='I':
                    matriz[i][j] = 'I'
                    i = -1  # Quando somado +1 fora desse while i vira 0, voltando ao comeco da matriz
                    break
                elif i < N-1 and matriz[i+1][j]=='I':
                    matriz[i][j] = 'I'
                    i = -1
                    break
                elif j > 0 and matriz[i][j-1]=='I':
                    matriz[i][j] = 'I'
                    i = -1
                    break
                elif j < M-1 and matriz[i][j+1]=='I':
                    matriz[i][j] = 'I'
                    i = -1
                    break
            j=j+1
        i=i+1
                    
    for i in matriz:
        for j in i:
            print(j, end=' ')
        print("")
    print("")

 

Link para o comentário
Compartilhar em outros sites

  • 0
23 horas atrás, isrnick disse:

Aqui fiz as correções, coloquei comentários para explicar as modificações:


from __future__ import print_function

while True:
    print("Digite a quantidade de colunas e linhas, respectivamente:")
    valores = raw_input()
    partes = valores.split()

    N = (int(partes[0]))
    M = (int(partes[1]))
    
    # Coloquei a condicao de parada do programa aqui em cima
    if N == 0 and M == 0:
        break

    matriz = []
    icones = ['x', 'I', 'F']
    print("Digite o ambiente do tesouro")
    for i in range(N):
        partes = []
        valores = raw_input()
        partes = valores.split()

        matriz.append(partes[0:])
        
    print("")

    for i in matriz:
        for j in i:
            # Corrigi essa linha aqui abaixo tambem, compare com o original.
            if j not in icones: 
                print("Somente os caracteres abaixo sao permitidos")
                print(icones)
            else:
                None

    # Na logica abaixo eu mudei para voltar para o comeco da matriz quando
    # algum F for alterado para I, para isso funcionar tive que usar ciclos
    # while ao inves de for:
    i = 0
    while i < N:
        j = 0
        while j < M:
            if matriz[i][j] == 'F':
                # Abaixo eu checo o valor da coordenada i ou j primeiro, para nao
                # usar valores invalidos nos indices da matriz.
                # Ex: matriz[-1][0] nao e valido.
                if i > 0 and matriz[i-1][j]=='I':
                    matriz[i][j] = 'I'
                    i = -1  # Quando somado +1 fora desse while i vira 0, voltando ao comeco da matriz
                    break
                elif i < N-1 and matriz[i+1][j]=='I':
                    matriz[i][j] = 'I'
                    i = -1
                    break
                elif j > 0 and matriz[i][j-1]=='I':
                    matriz[i][j] = 'I'
                    i = -1
                    break
                elif j < M-1 and matriz[i][j+1]=='I':
                    matriz[i][j] = 'I'
                    i = -1
                    break
            j=j+1
        i=i+1
                    
    for i in matriz:
        for j in i:
            print(j, end=' ')
        print("")
    print("")

 

Certo, peguei mais ou menos a ideia, mas onde exatamente ele troca o F pelo I na matriz? Por que pelo que entendi, ele só localiza se há "I" em torno do "F" mas não o substitui. Eu testei o código e realmente funciona, não consigo entender qual parte diz para trocar as letras, pode me auxiliar?

Link para o comentário
Compartilhar em outros sites

  • 0

Acabei de notar que meu programa de resposta ao problema original do tópico tinha uma falha, se o tesouro estiver no ponto de partida do mapa ele daria que 'Esse mapa não leva a lugar algum' o que seria um erro.

Então aqui está com a correção:

direcao = {'<' : ( 0, -1),
           '>' : ( 0,  1),
           '^' : (-1,  0),
           'v' : ( 1,  0),
           '*' : ( 0,  0)}

with open('mapa.txt', 'r') as arquivo:
    entrada = arquivo.readlines()
    
    col, lin = entrada[0].split()
    lin = int(lin)
    col = int(col)
    
    mapa = []
    for linha in entrada[1:]:
        mapa.append([caractere for caractere in linha])
    
    i, j = 0, 0
    
    continuar = True
    locais = []   #locais com icones de direcao ja visitados
    if(mapa[0][0] == '.'):  #se o ponto de partida nao apontar p/ nenhuma direcao
        print('Esse mapa nao leva a lugar algum')
        continuar = False
    else:
        di, dj = direcao[mapa[0][0]]
        locais.append((0, 0))
    #Se o tesouro estiver no ponto de partida:
    if mapa[0][0] == '*':
        print('Esse mapa leva ao tesouro')
        continuar = False
    
    while continuar:
        #Move na direcao indicada:
        i = i + di
        j = j + dj
        
        #Se ja passou pelo local desta seta, esta andando em circulos:
        if (i, j) in locais:
            print('Esse mapa nao leva a lugar algum')
            continuar = False
            
        #Se ainda estiver dentro do terreno:
        elif i>=0 and i<lin and j>=0 and j<col:
            if mapa[i][j] != '.':
                di, dj = direcao[mapa[i][j]]
                locais.append((i, j))
            if mapa[i][j] == '*':
                print('Esse mapa leva ao tesouro')
                continuar = False
                
        #Se tiver saido do terreno:
        else:
            print('Esse mapa nao leva a lugar algum')
            continuar = False

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...