Advertisement
D14M4NTE

Resolver una sopa de letras

Jan 4th, 2013
4,905
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.96 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf8 -*-
  3. def Matriz_y_palabras():
  4.     archivo=open("datos.txt","r")       #abrimos el archivo en modo lectura (read)
  5.     datos=archivo.readlines()   #nos devuelve todas las lineas como una lista
  6.     M,N=(datos[0].replace("\n","")).split(" ")      #Sacamos el tamano de la matriz MxN
  7.     matriz=[]       #esta sera nuestra matriz final
  8.     for i in range (0,int(M))#recorremos todas la filas, desde cero hasta M
  9.         columna=[]      #guardaremos los valores de las columnas
  10.         for j in range (0,int(N))#recorremos todas las columnas, de cero a N
  11.             columna.append(datos[1+i][j])       #le agregamos las letras que esten en la fila 1+i y la columna j
  12.         matriz.append(columna)  #creamos la matriz bidimensional
  13.     palabras=datos[-1].split(",")       #sacamos la lista con las palabras a buscar
  14.     return int(M),int(N),matriz,palabras    #retornamos los valores
  15.  
  16.  
  17. def verificando(op,i,j,matriz,palabra):
  18.     if len(palabra)==1: #solo cuando la funcion llege a la ultima letra, se detendra la recursion
  19.         respuesta=True 
  20.         return respuesta    #retornamos True
  21.     else:   #esta sera la parte recursiva, para las ocho posibles maneras de hallar la palabra
  22.         if (op==1): #manera 1
  23.             i=i
  24.             j=j+1
  25.         elif (op==2):   #manera 2
  26.             i=i
  27.             j=j-1
  28.         elif (op==3):   #manera 3
  29.             i=i-1
  30.             j=j
  31.         elif (op==4):   #manera 4
  32.             i=i+1
  33.             j=j
  34.         elif (op==5):   #manera 5
  35.             i=i-1
  36.             j=j-1
  37.         elif (op==6):   #manera 6
  38.             i=i+1
  39.             j=j-1
  40.         elif (op==7):   #manera 7
  41.             i=i-1
  42.             j=j+1
  43.         elif (op==8):   #manera 8
  44.             i=i+1
  45.             j=j+1
  46.         else:
  47.             print "ERROR [+]"   #definimos un error, que no se va a dar
  48.        
  49.         try:    #aqui hacemos manejo de errores, para no hacer el codigo mas largo y evitar la sentencia de cada posible caso
  50.             if matriz[i][j]==palabra[0]:    #verificamos que la nueva posicion (i,j) sea igual a la letra
  51.                 nueva=palabra[1:]   #de ser verdadera, iremos recortando la letra que ya verificamos de la palabra inicial
  52.                 a=verificando(op,i,j,matriz,nueva)  #llamamos la recursion con los nuevos datos
  53.                 if a==True: #al llegar al final de la recursion, tenemos que retornar algo
  54.                     return a    #retornamos el valor TRUE
  55.             else:
  56.                 respuesta=False
  57.                 return respuesta    #retornamos el valor FALSE
  58.         except: #en caso de error, se ejecuta esto
  59.             respuesta=False
  60.             return respuesta    #retornamos FALSE
  61.            
  62. def Ocho_posibilidades(matriz,i,j,palabra):
  63.     posibles={1:"hacia la derecha", 2:"hacia la izquierda", 3:"hacia arriba", 4:"hacia abajo", 5:"en forma Diagonal Superior Izquierda", 6:"en forma Diagonal Inferior Izquierda", 7:"en forma Diagonal Superior Derecha", 8:"en forma Diagonal Inferior Derecha"}
  64.     nueva=palabra[1:]   #quitamos la letra inicial a la palabra a buscar
  65.     for x in range(1,9):    #recorremos las ocho posibles maneras
  66.         veri=verificando(x,i,j,matriz,nueva)    #llamamos la recursion
  67.         if (veri==True):    #si es verdadero, signifia que se hallo la palabra
  68.             print "La palabra {0} esta ubicada en la posicion ({1},{2}) {3}".format(palabra,i+1,j+1,posibles[x])    #imprimimos el mensaje
  69.             return veri #retornamos que la encontramos, para evitar que se siga con las demas posibles formas de hallarla
  70.                
  71. def Posicion_inicial(buscando,matriz,M,N):
  72.     for i in range(0,M):    #recorremos las filas de la matriz 
  73.         for j in range(0,N):    #recorremos las columnas de la matriz
  74.             if (buscando[0] == matriz[i][j]):   #verificamos hay alguna letra en esas posicion (i,j) que sea igual a la primera letra de la palabra que buscamos
  75.                 terminado=Ocho_posibilidades(matriz,i,j,buscando)   #de haberla encontrado, llamamos a las verificamos las ocho posibles formas de terminar de hallar la palabra
  76.                 if (terminado==True):   #esto es verdadero cuando hemos hallado la palabra
  77.                     return terminado    #el return termina toda la funcion, en cambio en break, termina la sentencia
  78.                     #asi evitamos que se halle la misma palabra varias veces
  79.                
  80.    
  81. M,N,matriz,palabras=Matriz_y_palabras() #int(M),int(N),matriz,palabras
  82. for x in palabras:  #recorremos la lista de palabras
  83.     Posicion_inicial(x,matriz,M,N)  #buscamos la primera letra de cada palabra en la matriz
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement