Program do układania krzyżówki

Program do układania krzyżówki
WO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Poniżej fragment mojego programu układającego krzyżówkę 6 na 6 z wyrazów 6, 7 i 8 literowych. Prosiłbym o spojrzenie na ten program profesjonalnym okiem i podpowiedź, co można w nim zmienić w celu przyspieszenia działania.

Kopiuj
Program Krzyzowka6na6;
Uses Crt,Dos;
Type short9 = Array[1..8] Of Char;
     plik   = Array[1..8000] Of Short9;
     plik2  = Array[8001..16000] Of Short9;
     plik3  = Array[16001..24000] Of Short9;
     plik4  = Array[24001..32000] Of Short9;
     tab5   = Array[65..99,65..100] Of Word;
     tab5a  = Array[65..82] Of tab5;
     tab5b  = Array[83..99] Of tab5;
     ind0   = Array[4..10] Of tab5;
     ind1   = Array[2..3,65..100] Of Word;
Var  zbior      : File;
     plik1,plik11, plik5: Text;
     A          : ^plik;
     AX         : ^plik2;
     AY         : ^plik3;
     AZ         : ^plik4;
     ind5s      : ind0;
     ind3s      : ind1;
     ind5a      : ^tab5a;
     ind5b      : ^tab5b;
     znak       : Char;
     wpoz,wpion                              : String[8];
     wpion1,wpion2,wpoz1                     : String[8];
     wzero                                   : String[11];
     licz, ii                                : Integer;
     i,j,k,x,xy,st7a,ko7a,st8a,ko8a          : Word;
     st1,ko1,st2a,ko2a,st6a,ko6a,st9a        : Word;
     st3a,ko3a,st4a,ko4a,st5a,ko5a,ko9a      : Word;
     st10a,ko10a,st6,st7,st8,st9,st10        : Word;
     w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11      : short9;

     Procedure LadujWyrazy;
  Begin
    Assign(zbior,'PN8X.BLR');Reset(zbior,1);BlockRead(zbior,A^,64000);Close(zbior);
    Assign(zbior,'PN8Y.BLR');Reset(zbior,1);BlockRead(zbior,AX^,64000);Close(zbior);
    Assign(zbior,'PN8Z.BLR');Reset(zbior,1);BlockRead(zbior,AY^,64000);Close(zbior);
    Assign(zbior,'PN8Q.BLR');Reset(zbior,1);BlockRead(zbior,AZ^,31248);Close(zbior);
    Assign(zbior,'PN8A.IND');Reset(zbior,1);BlockRead(zbior,IND5A^,45360);Close(zbior);
    Assign(zbior,'PN8B.IND');Reset(zbior,1);BlockRead(zbior,IND5B^,42840);Close(zbior);
  End;
 Procedure LadujTablice;
  Begin
    For i:=4 To 10 Do
    For j:=65 To 99 Do
    For k:=65 To 100 Do
    Begin
      If Ord(wzero[i])<=82 Then ind5s[i,j,k]:=ind5a^[Ord(wzero[i]),j,k]
      Else ind5s[i,j,k]:=ind5b^[Ord(wzero[i]),j,k];
    End;
  End;
 Procedure LadujIndeksy;
 begin
  For i:=2 To 3 Do
    For k:=65 To 100 Do
      ind3s[i,k]:=ind5b^[87,Ord(wzero[i]),k];
  End;

  Procedure Wyraz10;
  Begin
    Repeat
      If st10a<=8000 Then w10:=A^[st10a] Else If st10a<=16000 Then w10:=AX^[st10a] Else
      If st10a<=24000 Then w10:=AY^[st10a] Else w10:=AZ^[st10a];
      If w10[2]=w9[2] Then
      If w10[3]=w7[2] Then
      If w10[4]=w5[2] Then
      If w10<>w9 Then
      If (w8[1]='o') Or (w10[1]='o') Then
      If (w8[8]='o') Or (w10[8]='o') Then Zapis;
      st10a:=st10a+1;
    Until st10a=ko10a;
  End;
4w0rX4t4X
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 351
0

W celu przyspieszania działania przede wszystkim należy zmienić podejście i algorytm - czyli w tym przypadku prawie wszystko.
Możesz użyć do tego np. algorytmu genetycznego. On daje szybkie ale nie perfekcyjne rozwiązania. W krzyżówkach jednak bardzo dobrze się sprawdza.

Inna metoda, bardziej klasyczna wymaga przygotowania gotowych słowników, które natychmiast dają odpowiedź / wyraz w odpowiedzi na zapytanie o maskę np.:
podaj wyraz, który ma 6 liter gdzie trzecia litera to "P" a piąta to "G". Słownik będzie dość duży ale to praca jednorazowa i potem nie tracisz czasu na ciągłe wyszukiwanie wymaganych wyrazów.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.