SamuelKostadinov

Es a tempo 5

Jun 27th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.83 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. //PRE=(N ha almeno m*m elementi definiti,  0<=i<m, j è definito e P ha m-i posizioni)
  5.  
  6. bool trova(bool* N, int m, int i, int j, int*P){
  7.     if(N[i * m + j] != 1){
  8.         return false;
  9.     }else if(N[i * m + j] && i == 4){
  10.         P[i] = j;
  11.         return true;
  12.     }else{
  13.         P[i] = j;
  14.         if(i == 0){
  15.             return trova(N, m, i + 1, j, P) || trova(N, m, i + 1, j + 1, P);
  16.         }else if(i == 4){
  17.             return trova(N, m, i + 1, j - 1, P) || trova(N, m, i + 1, j, P);
  18.         }else{
  19.             return trova(N, m, i + 1, j - 1, P) || trova(N, m, i + 1, j, P) || trova(N, m, i + 1, j + 1, P);
  20.         }
  21.     }
  22. }
  23.  
  24. //POST_t=(restituisce true sse in N vista come X[m][m] c’è un cammino dalla casella(i,j) alla riga m-1 composto da sole caselle bianche)&&(se la risposta è true,in P [0..m-i-1] c’è il cammino più a sinistra con queste proprietà)
  25.  
  26. /*
  27.  
  28.     Caso base 1:
  29.         La casella esaminata contiene un valore diverso da 1: in tal caso non sono in un percorso valido, perciò è corretto ritornare false
  30.     Caso base 2:
  31.         La casella esaminata contiene il valore 1 e si trova nell'ultima riga (riga m): in tal caso, dopo aver salvato la posizione,
  32.         è corretto restituire true in quanto esiste un percorso valido per arrivare all'ultima riga
  33.    
  34.     A questo punto salvo la posizione di N in cui mi trovo e si presentano 3 casi:
  35.     Caso 1:
  36.         Se i == 0:
  37.             In tal caso per rispettare la PRE si devono controllare soltanto le celle sotto o a sinistra di quella corrente in quanto quella a
  38.             destra avrebbe un indice negativo
  39.     Caso 2:
  40.         Se i == 4
  41.             Con un ragionamento analogo a quello descritto per i == 0 si capisce che bisogna controllare soltanto gli elementi sotto e a destra della
  42.             cella corrente in quanto quella a sinistra avrebbe un indice oltre m
  43.     Caso 3:    
  44.         Se 0 < i < 4:
  45.             In questo caso vanno controllate sia la cella direttamente sotto che quella sotto a sinistra che quella sotto a destra in quanto
  46.             potrebbero formare un percorso valido e non sforano il limite imposto da m
  47.            
  48.     Così facendo so che il parametro i rispetta la PRE della funzione.
  49.     Le variabili P, n e j sono parametri sempre definiti, in quanto o vengono passati dalla funzione partenza (all'interno della quale sono definiti)
  50.     o dalla funzione trova stessa. La funzione trova non modifica mai N, quindi questo parametro sarà sempre definito. P viene modificato tuttavia
  51.     solo i valori sono modificati, quindi la variabile è sempre definita. Infine j è un intero a cui viene sommato 1, il che porta a dire che
  52.     il parametro j è sempre definito. Infine so che N ha almeno m * m elementi definiti in quanto viene preso come parametro che rispetta tale condizione
  53.     quando la prima volta che la funzione trova viene chiamata e poi non viene mai modificato.
  54.    
  55.     Quindi posso dire che la PRE viene rispettata. Posso quindi fare il passo induttivo e supporre che la POST sia rispettata.
  56.    
  57.     Visto che la POST viene rispettata posso dire che se la funzione restituisce false non esiste un percorso valido, se invece restituisce true
  58.     esiste un percorso valido dalla casella su cui è richiamata ad una dell'ultima riga. Inoltre so di per certo che se esiste un percorso da una
  59.     cella che contiene 1 alla fine e che dalla cella in cui mi trovo alla cella da cui conosco il percorso per la fine allora esiste anche un
  60.     percorso dalla cella in cui mi trovo alla fine.
  61.     Inoltre se il percorso contenuto in P è il più a sinistra dalla cella esaminata fino alla fine allora anche dalla cella in cui mi trovo
  62.     il percorso sarà quello più a sinistra
  63.    
  64. */
  65.  
  66. //PRE_p=(N ha m*m valori definiti, 0<=k<=m e P ha m elementi)
  67. bool partenza(bool* N, int m, int k, int* P){
  68.     if(trova(N, m, 0, k, P)){
  69.         return true;
  70.     }else{
  71.         if(k < m){
  72.             return partenza(N, m, k + 1, P);
  73.         }else{
  74.             return false;
  75.         }
  76.     }
  77. }
  78. //POST_p=(risponde true sse esiste un cammino di caselle bianche dalla prima all’ultima riga di N, vista come X[m][m], e che inizia in una casella tra i e m-1 della prima riga di X)&&(se risponde true allora P[0..m-1] è il cammino più a sinistra con queste proprietà)
  79.  
  80. /*
  81.  
  82.     Caso base 1:
  83.         La funzione trova resituisce true, quindi esiste un percorso che porta all'ultima riga: in tal caso è corretto restituire true;
  84.     Caso base 2:
  85.         La funzione trova restituisce false, quindi non esiste un percorso che porta all'ultima riga & k(colonna corrente) == m (ultima colonna):
  86.         in tal caso ho esaminato tutte le possibili partenze e non ho trovato percorsi validi quindi è corretto restituire true
  87.        
  88.     A questo punto suppondo che la funzione trova restituisca false e che k < m:
  89.         Siccome N contiene m * m elementi definiti (viene passato dal main, nel quale viene definito in modo da rispettare tale condizione e mai modificato),
  90.         P ha m elementi (viene passato dal main, in cui viene definito in modo da rispettare tale condizione e non viene mai modificata la sua dimensione).
  91.         A questo punto bisogna discutere i possibili valori di k e vedere se rispettano la PRE. si ha che k >= 0 in quanto viene passato
  92.         come parametro uguale a 0 e poi non viene mai aumentato. Inoltre k <= m in quanto se k == m si rientra nel caso base sia che trova ritorni
  93.         true sia che trova ritorni false.
  94.         Visto che la PRE viene rispettata posso compiere il passo induttivo e supporre che la POST sia rispettata.
  95.        
  96.         Ci sono a questo punto 2 casi:
  97.             1 - se partenza ritorna true esiste un percorso tale che parta dalla cella esaminata e arrivi alla fine della matrice
  98.             2 - se partenza ritorna false esamino la cella di partenza successiva (se esiste). Se questa ritorna true allora il percorso esiste,
  99.                 altrimenti ripeto il passo 2.
  100.                
  101.         Se ho esaminato tutte le possibili partenze e la funzione ha sempre ritornato false allora il percorso non esiste.
  102.         Inoltre P contiene il percorso più a sinistra come dimostrato dalla POST della funzione trova e dal fatto che l'array no nvenga modificato
  103.         nella funzione partenza-
  104.            
  105.  
  106. */
  107.  
  108. void stampa(int*P,int m,int i)
  109. {
  110.   if(i==m)
  111.     {cout<<endl; return;}
  112.   cout<<'('<<i<<','<<P[i]<<')'<<' ';
  113.   stampa(P,m,i+1);
  114. }
  115.  
  116. int main()
  117. {
  118.   int m;
  119.   cin>>m;
  120.   int*P=new int[m];
  121.   bool*N =new bool[m*m];
  122.   for(int i=0; i<m*m; i++)
  123.           cin>>N[i];
  124.   bool x=partenza(N,m,0,P);//da fare
  125.   cout<<"start"<<endl;
  126.   if(x)
  127.     { cout<<"esiste un cammino e quello più a sinistra è:"<<endl;
  128.       stampa(P,m,0);
  129.      
  130.     }    
  131.   else
  132.     cout<<"il cammino non esiste"<<endl;
  133.   cout<<"end"<<endl;
  134.    return 0;  
  135. }
Add Comment
Please, Sign In to add comment