0

这就是问题:

要解决这个难题,您需要搜索然后从 wordsearch 中删除列表中所有单词的 OCCURRENCES(如果有多个)。

将保留的图表字母,按行和列的顺序全部排列,它们将形成游戏的解决方案。

单词可以水平(从右到左,或从左到右),垂直(向下或向下朝向顶部)和对角线(从上到下或从下到上)出现在图表中。

定义一个函数es1(ftxt),它取一个文本文件的地址,包含一个十字形的字图,并返回游戏的字符串解。

fname 文件包含单词列表后面的单词搜索。图表前面的一系列 1 个或多个空行将图表与单词列表分开,并在单词列表之后。该图是按行记录的(每行一行和连续行),每行的制表符由单个字符('\t')分隔。连续忙字列表,每行一个字。

O   T   N   E   G   R   A   S   A   E
R   N   N   C   O   R   A   L   L   O
O   A   I   B   L   U   E   E   V   G
U   T   O   R   E   N   T   I   I   A
V   I   O   L   E   T   T   O   O   R
O   C   R   A   R   I   A   E   L   O
D   A   B   I   M   A   L   V   A   P
I   P   C   I   E   L   O   G   L   R
C   O   R   P   O   S   O   U   A   O
A   P   I   E   N   O   M   I   L   P


ACIDO
ARGENTO
BLU
CIELO
CORALLO
CORPOSO
ELETTRICO
LATTE
LIMONE
MALVA
NERO
OCRA
OPACITA
ORO
PAGLIERINO
PIENO
PORPORA
PRIMITIVO
VIOLA
VIOLETTO

我已经找到了所有的行、列和50%的对角线,但是我不知道如何找到所有方向找到的字符的坐标来删除它然后有解决方案。

这是我的代码:

  with open('cp5_Colori.txt', 'r') as f:

  data=f.read().replace("\t","")
    data=data.split("\n\n")
    lista_parole=data[1].split()
    lista_orizzontale=data[0].split()
    oriz_contraria=[x[::-1] for x in lista_orizzontale]
    diz={}
    c=0
    b=0

    cruzi_verticali=[]
    for x in lista_parole:                  #loop to find rows and add the 
                                             found 
                                             words to a diz

        for y in lista_orizzontale:
            if x in y:
                diz[x]=1
        for z in oriz_contraria:
            if x in z:
                diz[x]=1

        while c <= len(lista_orizzontale):
            cruzi_verticali.append(lista_orizzontale[c][b])     #loop for 
                                                                  columns
            c+=1
            if c==len(lista_orizzontale):
                cruzi_verticali.append("///")
                c=0
                b+=1
                if b==len(lista_orizzontale):
                    c=len(lista_orizzontale)+1




    joinata="".join(cruzi_verticali)
    parole_verticali=joinata.split("///")
    vert_contraria=[k[::-1] for k in parole_verticali]    #convert to a list 
                                                            of 
                                                            strings and find 
                                                            the 
                                                            reversed of 
                                                             colums
    conta=0
    conta2=0


    for x in lista_parole:
        for y in parole_verticali:
            if x in y:                          #loop to add search word to  
                                                  the diz
                diz[x]=1
        for z in vert_contraria:
            if x in z:
                diz[x]=1


    cruzi_diagonali=[]            
    parole_diagonali=[]
    diag_contraria=[]            
    prova=[]            
    itera=len(parole_verticali)**2            
    while len(prova)!=len(parole_verticali)-1:
        cruzi_diagonali.append(parole_verticali[conta][conta2])        
        conta+=1
        conta2+=1
        if conta==len(lista_orizzontale):
            cruzi_diagonali.append("///")                                    
                                                    #loop to find a part of 
                                                     diagonals
        if conta==len(parole_verticali)-1:
            conta=0
            if conta==0:
                prova.append(0)
                conta=conta+len(prova)
                conta2=0
    prova2=[]            
    conta3=0
    conta4=1
    while len(prova2)!=len(parole_verticali)-1:
        cruzi_diagonali.append(parole_verticali[conta3][conta4])
        conta3+=1
        conta4+=1
        if conta4==len(lista_orizzontale):
            cruzi_diagonali.append("///")
                                                #loop to find lower 
                                                 diagonals
        if conta4==len(parole_verticali)-1:
            conta4=0
            if conta4==0:
                prova2.append(0)
                conta4=conta4+len(prova2)
                conta3=0

    joinata2="".join(cruzi_diagonali)
    parole_diagonali=joinata2.split("///")               #convert diagonals 
                                                            into 
                                                          a list of strings
    diag_contraria=[k[::-1] for k in parole_diagonali]   

    for x in lista_parole:
       for y in set(parole_diagonali):
           if x in y:                          #loop to add the found words in 
                                               the dictionary as keys
               diz[x]=1
       for z in set(diag_contraria):
          if x in z:
             diz[x]=1

    soluzione=[]            
    lista_totale=[]
    lista_orizzontale2=lista_orizzontale[:]
    for k in diz.keys():
        for k2 in lista_orizzontale2:             #all the found words in 
                                                  the 

                                                   row replaced with "*"
            if k in k2:
                hg=len(k)*"*"
                k3=k2.replace(k,hg)
                lista_orizzontale2.append(k3)
                if "*" not in k2:
                    lista_orizzontale2.remove(k2)

有人可以通过在 wordsearch 中找到找到的字母的所有坐标来帮助我吗?

4

2 回答 2

1

你让自己的事情变得相当困难。无需在每个方向上转换拼图数组,只需依次访问每个字母并从该字母开始在八个方向中的每一个中查找单词。

由于这似乎是某种家庭作业,因此我将让您填写详细信息,但您的代码的基本轮廓应如下所示:

puzzle = [list(row) for row in 'OTNEGRASAE', 'RNNCORALLO', 'OAIBLUEEVG',
        'UTORENTIIA', 'VIOLETTOOR', 'OCRARIAELO', 'DABIMALVAP', 'IPCIELOGLR',
        'CORPOSOUAO', 'APIENOMILP']
word_list = ['ACIDO', 'ARGENTO', 'BLU', 'CIELO', 'CORALLO', 'CORPOSO', 'ELETTRICO',
        'LATTE', 'LIMONE', 'MALVA', 'NERO', 'OCRA', 'OPACITA', 'ORO', 'PAGLIERINO',
        'PIENO', 'PORPORA', 'PRIMITIVO', 'VIOLA', 'VIOLETTO']

for {each word in word_list}:
    for {each cell in puzzle}:
            if {cell.upper() == first character of word}:
                for direction in [(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1)]:
                    (dx, dy) = direction
                    {Does the puzzle contain all the other characters of word in this direction?}
                    {If so change these cells to lower case, and skip to next word}

{extract all the remaining upper case letters from the puzzle}
于 2018-11-18T12:39:18.440 回答
0

这是我从你的想法中获得的新代码:

with open('cp5_Colori.txt', 'r') as f:
import pprint
data=f.read().replace("\t","")
A=[]
data=data.split("\n\n")
word_list=data[1].split()
lista_orizzontale=data[0].split()
puzzle=[list(row) for row in lista_orizzontale]
for parola in word_list:
    for lista in puzzle:
        x=puzzle.index(lista)
        for carattere in lista:
            y=lista.index(carattere)
            if carattere.upper() == parola[0]:
                for direction in [(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1)]:
                    (dx, dy) = direction
                    for i in range(len(parola)):    
                        if ((puzzle[x+dx*i][y+dy*i].upper()== parola[i]) and ((x+dx*i)<len(puzzle)) and ((y+dy*i)<len(lista))) == True: 
                            A.append(puzzle[x+dx*i][y+dy*i])
                            if "".join(A)==parola:



                        else:
                            break
pprint.pprint(puzzle)

这里

我不救援来寻找解决方案。解决方案应该是“sangueblu”有什么问题?

于 2018-11-18T20:09:32.963 回答