Pages: [1]   Go Down
Print
Author Topic: Trovare 5 elementi uguali a forma di croce in una matrice  (Read 1611 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« on: 02-03-2011, 12:22:31 »

Ragazzi sapreste dirmi dov è che sbaglio?? è da un po di ore che cerco di arrivare a una soluzione ma niente da fare (sto impazzendo)..Se riuscite potreste correggermi il codice?? PS il codice l'ho scritto in maniera veloce senza metodi...GRAZIE  

Code:
import javax.swing.*;
public class esercizioprogetto
{

public static void main(String[] args)
{
int [][] A= new int [4][4];
boolean trovato=false;

for(int i=0;i<A.length;i++)
for(int j=0;j<A[i].length;j++)
A[i][j]=Integer.parseInt(JOptionPane.showInputDialog("Ins num"));

for(int i=0;i<A.length-1;i++)
for(int j=0;j<A[i].length;j++)
if(j==0)
trovato=false;
else
{
if(A[i][j]==A[i][j-1])
{
if(A[i][j]==A[i+1][j])
{
if(i!=A[i].length-1)
{
if(A[i][j]==A[i][j+1])
{
if(i!=0)
{
if(A[i][j]==A[i-1][j])
trovato=true;
}
}
}
}
}
}



for(int i=0;i<A.length;i++){
for(int j=0;j<A[i].length;j++){
System.out.print(A[i][j]+"    ");
}
System.out.println();
}

System.out.println(trovato);
}

}


es:

1 2 3 4 5
2 2 2 6 7
8 2 9 1 2
« Last Edit: 02-03-2011, 12:28:20 by salvopuglisi » Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #1 on: 02-03-2011, 13:01:55 »

c'è molto da aggiustare.
quella serie di if a cascata è un pò brutta da vedere, a mio parere. potresti ovviare mettendoli nello stesso if con una serie di operatori &&, xkè tanto se il primo nn è vero, non avanti a controllare il valore di verità degli altri.
quindi ti vorrei consigliare un paio di cose da fare.
se avessi come supposizione che la matrice in input nel metodo fosse rettangolare, quindi x ora nn trattiamo i frastagliati, allora procederei intanto facendo anche un'altra supposizione. per esistere questa croce come dici te, la matrice deve essere minimo una 3x3, poi il numero di righe e colonne può anche essere più grande.
detto questo si potrebbe operare così:
Code:
boolean metodo(int[][] A)
{
boolean trovato=false;
if(A.length>2 && A[0].length>2)
{
for(int i=1;i<A.length-1;i++)
for(int j=1;j<A[0].length-1;j++)
if((A[i][j]==A[i-1][j] && A[i][j]==A[i+1][j]) && (A[i][j]==A[i][j-1] && A[i][j]==A[i][j+1]))
trovato=true;
}
return trovato;
}

altrimenti supponiamo di avere una matrice rettangolare in genere, quindi potrebbe essere anche una 1x2, 2x1, 2x2, 2x3, ecc...
allora diventerebbe così:
Code:
boolean metodo(int[][] A)
{
boolean trovato=false;
for(int i=0;i<A.length-1;i++)
if(i>0)
for(int j=0;j<A[0].length-1;j++)
if(j>0 && ((A[i][j]==A[i-1][j] && A[i][j]==A[i+1][j]) && (A[i][j]==A[i][j-1] && A[i][j+1])))
trovato=true;
}
return trovato;
}

Logged

"Che la Forza sia con Te"
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #2 on: 02-03-2011, 13:24:51 »

ti ringrazio 6 stato molto kiaro :=) grazie   .
« Last Edit: 02-03-2011, 13:43:35 by salvopuglisi » Logged
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #3 on: 02-03-2011, 13:56:25 »

una piccola cosa, devo fare un esercizio che mi chiede :data una matrice 5x6 dire se esistono piu di due contigui in linea orizz o vert....

es:
1 2 3 4 5 6
7 8 9 1 1 1    true xk ci sono più di 2 elementi contigui orizz.
3 4 5 6 7 8  
9 0 1 2 3 4
5 6 7 8 9 0

1 2 3 4 5 6
7 8 9 2 3 4    
3 4 5 5 6 7    false
9 0 5 2 3 4
5 6 7 8 9 0

1 2 3 4 5 6
7 8 5 2 3 4    
3 4 5 5 6 7    true
9 0 5 2 3 4
5 6 7 8 9 0

ho pensato di prendere il codice che mi hai aiutato a scrivere te e di modificare certe cose:

Code:
public boolean metodo(int [][] A)
{
for(int i=1;i<A.length-2;i++)
for(int j=1;j<A[0].length-2;j++)
if(A[i][j]==A[i-1][j] && A[i][j]==A[i-2][j])
{
return true;
if(A[i][j]==A[i+1][j] && A[i][j]==A[i+2][j])
{
return true;
if(A[i][j]==A[i][j-1] && A[i][j]==A[i][j-2])
{
return true;
if(A[i][j]==A[i][j+1] && A[i][j]==A[i][j+2])
{
return true;
}
}
}
}
return false;
}

Allora il codice che ho scritto io non funziona però volevo capire se ero nella giusta strada oppure ci sono troppi errori...GRAZIE
« Last Edit: 02-03-2011, 13:58:53 by salvopuglisi » Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #4 on: 02-03-2011, 14:10:43 »

intanto i e j devono partire da 0, nn da 1.
poi nn devi mettere stavolta le limitazioni alle lunghezze di riga e colonna -2, sennò escludi gli elementi contigui nelle ultime due righe o colonne.
questo
Code:
if(A[i][j]==A[i][j-1] && A[i][j]==A[i][j-2])

è inutile
e pure questo
Code:
if(A[i][j]==A[i-1][j] && A[i][j]==A[i-2][j])
invece per risolvere veramente il problema dovresti mettere all'inizio un if dentro i cicli che, se ti trovi nelle ultime due righe devi fare solo il controllo in orizzontale, se ti trovi nelle ultime due colonne devi fare il solo controllo verticale
« Last Edit: 02-03-2011, 14:13:53 by StephCT » Logged

"Che la Forza sia con Te"
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #5 on: 02-03-2011, 14:28:01 »

ok c provo 
Logged
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #6 on: 02-03-2011, 14:43:06 »

Intendevi dire questo ? mi da come sempre errore

Code:
public boolean metodo(int [][] A)
{
for(int i=0;i<A.length;i++)
for(int j=0;j<A[0].length;j++)
{
if(i==A.length-2)
{
if(A[i][j]==A[i][j+1] && A[i][j]==A[i][j+2])
{
return true;
}
}
else if(j==A[i].length-2)
{
if(A[i][j]==A[i+1][j] && A[i][j]==A[i+2][j])
{
return true;
}
}

else if(A[i][j]==A[i+1][j] && A[i][j]==A[i+2][j])
{
trovato=true;
if(A[i][j]==A[i][j+1] && A[i][j]==A[i][j+2])
{
return true;
}
}
}

return false;
}
Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #7 on: 02-03-2011, 15:56:28 »

cn un pò di fretta vedo di correggere ciò che posso.

Code:
if(i==A.length-2)
{
if(A[i][j]==A[i][j+1] && A[i][j]==A[i][j+2])
{
return true;
}
}

questo lo puoi fare solo se i>=A.length-2, nn solo uguale, e j<A[0].length-2

Code:
else if(j==A[i].length-2)
{
if(A[i][j]==A[i+1][j] && A[i][j]==A[i+2][j])
{
return true;
}
}

anche qui è j>=A[0].length-2 e i<A.length-2

il secondo else if dovrebbe diventare un else con dentro l'if annidato, non contemporaneo.
Logged

"Che la Forza sia con Te"
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #8 on: 02-03-2011, 16:21:34 »

non preoccuparti se nn puoi rispondermi...nn è un esercizio che mi serve subito e cmq ti ringrazio  

Code:
public boolean metodo(int [][] A)
{
for(int i=0;i<A.length;i++)
for(int j=0;j<A[0].length;j++)
{
if(i>=A.length-2 && j<A[0].length-2)
{
if(A[i][j]==A[i][j+1] && A[i][j]==A[i][j+2])
{
return true;
}
}
else if(j>=A[0].length-2 && i<A.length-2)
{
if(A[i][j]==A[i+1][j] && A[i][j]==A[i+2][j])
{
return true;
}
}

else
{
if(A[i][j]==A[i+1][j] && A[i][j]==A[i+2][j])
{
return true;

if(A[i][j]==A[i][j+1] && A[i][j]==A[i][j+2])
{
return  true;
}
}
}
}
return false;
}

Cosi facendo però mi da l'errore di  java.lang.ArrayIndexOutOfBoundsException.....
Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #9 on: 02-03-2011, 20:05:46 »

la fretta è sempre cattiva consigliera xD

l'ultimo non è solo un else ma
Code:
else if(i<A.length-2 && j<A[0].length-2)
{
if((A[i][j]==A[i+1][j] && A[i][j]==A[i+2][j]) || (A[i][j]==A[i][j+1] && A[i][j]==A[i][j+2]))
{
return  true;
}
}

hai bisogno di avere la conferma di essere in un punto dove puoi fare un doppio confronto contiguo. infatti nei primi due if si potrebbe anche non entrare ma essere in un punto in cui puoi solo fare il doppio confronto orizzontale o solo quello verticale. nn so se mi sono spiegato, cmq aggiustalo e vedi che ora funziona, ho provato io stesso con dei main di prova
Logged

"Che la Forza sia con Te"
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #10 on: 03-03-2011, 17:58:12 »

Ti ringrazio tantissimo, mi 6 stato d'aiuto 
Logged
Pages: [1]   Go Up
Print
Jump to: