sprawdzanie wystąpień układu znaków w tablicy

0

Witam,

Mam do zrobienia zadanie, w którym w tablicy losowo wygenerowanych znaków mam sprawdzić ile razy powtórzył się układ znaków 'a' 'l' 'a' w pionie, poziomie lub po skosie (coś jak w wykreślankach).
Wszystko niby się kompiluje, ale mimo tego, że widzę, iż taki układ występuje, to nie zostaje wyświetlona informacja o ilości tych wystąpień. Byłbym wdzięczny, gdyby ktoś powiedział czego mi tutaj brakuje.

import static java.lang.Math.*;
class Program{

	public static void main(String[] args){
		
		char[][] tab;
		tab = new char[10][10];
		
		for (int i=0; i<tab.length; i++){
			for(int j=0; j<tab.length; j++)
				tab[i][j]=((char)(97+(int)(random()*15)));
		}	
		
		print(tab);
		System.out.println();
		System.out.println(check(tab));
		
		
	}
	
	
	public static void print(char[][] data){
		
		for (int i=0; i<data.length; i++){
			for(int j=0; j<data.length; j++)
				System.out.print(data[i][j]+" ");
				System.out.println();
		}
	}
	
	public static int check(char[][] data){
		
		
		int phraseLicznik = 0;
		
		for (int i=0; i<data.length; i++){
			for(int j=0; j<data.length; j++){
				// szukam poziomo
				if(		
						j>data[i].length-1
						
					&&	data[i][j] == 'a' 
					&&	data[i][j+1] == 'l'
					&&	data[i][j+2] == 'a'
				){
					phraseLicznik++;	
				}
				// szukam pionowo
				else if(
						i>data.length-1
						
					&&	data[i][j] == 'a'
					&&	data[i-1][j]== 'l'
					&&	data[i-2][j]== 'a'
				){
					phraseLicznik++;
				}
				// szukam po skosie
				else if(
						i>data.length-1
					&&	j>data[i].length-1
					
					&&	data[i][j] == 'a'
					&&	data[i+1][j+1] == 'l'
					&&	data[i+2][j+2] == 'a'
				){
					phraseLicznik++;				
				}	
				
			}
		}
		return phraseLicznik;
	}
}
1

Przez warunek j>data[i].length-1 przy j mniejszym od 9 w ogóle nie przechodzi do kolejnych warunków data[i][j] == 'a' itd.

0

Ok, rzeczywiście znaki powinny być odwrotnie, ale z kolei teraz wywala, że wychodzę poza tablicę... :/
...
dobra, chyba ogarnąłem już dlaczego i wydaję mi się, że teraz jest ok

import static java.lang.Math.*;
class Program{

	public static void main(String[] args){
		
		char[][] tab;
		tab = new char[20][20];
		
		for (int i=0; i<tab.length; i++){
			for(int j=0; j<tab.length; j++)
				tab[i][j]=((char)(97+(int)(random()*15)));
		}	
		
		print(tab);
		System.out.println();
		System.out.println(check(tab));
		
		
	}
	
	
	public static void print(char[][] data){
		
		for (int i=0; i<data.length; i++){
			for(int j=0; j<data.length; j++)
				System.out.print(data[i][j]+" ");
				System.out.println();
		}
	}
	
	public static int check(char[][] data){
		
		
		int phraseLicznik = 0;
		
		for (int i=0; i<data.length; i++){
			for(int j=0; j<data.length; j++){
				// szukam poziomo
				if(		
						j<data[i].length-2
						
					&&	data[i][j] == 'a' 
					&&	data[i][j+1] == 'l'
					&&	data[i][j+2] == 'a'
				){
					phraseLicznik++;	
				}
				// szukam pionowo
				else if(
						i<data.length-2	
					&&	data[i][j] == 'a'
					&&	data[i+1][j]== 'l'
					&&	data[i+2][j]== 'a'
				){
					phraseLicznik++;
				}
				// szukam po skosie
				else if(
						i<data.length-2
					&&	j<data[i].length-2
					
					&&	data[i][j] == 'a'
					&&	data[i+1][j+1] == 'l'
					&&	data[i+2][j+2] == 'a'
				){
					phraseLicznik++;				
				}	
				
			}
		}
		return phraseLicznik;
	}
}
1
  1. Dlaczego pomijasz skosy typu "prawa góra" -> "lewy dół"?
  2. Jesteś niekonsekwentny:
        for (int i=0; i<data.length; i++){
            for(int j=0; j<data.length; j++){ //tu zakładasz, że tablica jest kwadratowa
                // szukam poziomo
                if(        
                        j<data[i].length-2 //a tu dopuszczasz tablicę prostokątną.
  1. Po co w powyższym kodzie kodzie ten if? Nie prościej:
        for (int i=0; i<data.length; i++){
            for(int j=0; j<data.length - 2; j++){
0
bogdans napisał(a):
  1. Dlaczego pomijasz skosy typu "prawa góra" -> "lewy dół"?
  2. Jesteś niekonsekwentny:
        for (int i=0; i<data.length; i++){
            for(int j=0; j<data.length; j++){ //tu zakładasz, że tablica jest kwadratowa
                // szukam poziomo
                if(        
                        j<data[i].length-2 //a tu dopuszczasz tablicę prostokątną.
  1. Po co w powyższym kodzie kodzie ten if? Nie prościej:
        for (int i=0; i<data.length; i++){
            for(int j=0; j<data.length - 2; j++){

w sumie z początku chciałem tylko sprawdzić dla chociażby części przypadków i zobaczyć czy będzie działać, ale rzeczywiście masz rację...jak coś robić, to porządnie :)

co do:

i<data.length-2
j<data.length-2

to chyba musze je zachować w tym wypadku dla konkretnych przypadków, gdy zwiększam odpowiednio i lub j czy coś przekombinowuję?

po Twoich uwagach wprowadziłem pewne poprawki:

import static java.lang.Math.*;
class Program{

	public static void main(String[] args){
		
		char[][] tab;
		tab = new char[10][10];
		
		for (int i=0; i<tab.length; i++){
			for(int j=0; j<tab.length; j++)
				tab[i][j]=((char)(97+(int)(random()*15)));
		}	
		
		print(tab);
		System.out.println();
		System.out.println(check(tab));
		
		
	}
	
	
	public static void print(char[][] data){
		
		for (int i=0; i<data.length; i++){
			for(int j=0; j<data.length; j++)
				System.out.print(data[i][j]+" ");
				System.out.println();
		}
	}
	
	public static int check(char[][] data){
		
		
		int phraseLicznik = 0;
		
		for (int i=0; i<data.length; i++){
			for(int j=0; j<data.length; j++){
				// szukam poziomo
				if(		
						  j<data.length-2
					
					&&	data[i][j] == 'a' 
					&&	data[i][j+1] == 'l'
					&&	data[i][j+2] == 'a'
				){
					phraseLicznik++;	
				}
				// szukam pionowo
				else if(
							  i<data.length-2
							
						&&	data[i][j] == 'a'
						&&	data[i+1][j]== 'l'
						&&	data[i+2][j]== 'a'
				){
					phraseLicznik++;
				}
				// szukam po skosie z góry na doł
				else if(
							  j<data.length-2
						&&	i<data.length-2
						
						&&	data[i][j] == 'a'
						&&	data[i+1][j+1] == 'l'
						&&	data[i+2][j+2] == 'a'
				){
					phraseLicznik++;				
				}	
				// szukam po skosie z dołu na górę
				else if(
							  i>1
						&&	j<data.length-2

						&&	data[i][j] == 'a'
						&&	data[i-1][j+1] == 'l'
						&&	data[i-2][j+2] == 'a'
				){
					phraseLicznik++;				
				}	
			}
		}
		return phraseLicznik;
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1