All pastes #2011826 Raw Edit

Projecto IP

public text v1 · immutable
#2011826 ·published 2010-12-06 11:10 UTC
rendered paste body
/**
 * @author Bruno Palma
 * Uma aplicacao que determina se um sistema fornecido pelo utilizador
 * e permeavel ou nao
 */

import java.util.Scanner;

public class Main {

	public static void main(String[] args){


        //informa o utilizador do funcionamento do programa


    		System.out.println("0 = no fechado");
        	System.out.println("1 = no aberto");

        //cria um scan ao System.in chamado sc

		Scanner sc = new Scanner(System.in);

		int[][] matriz;
		int dim;
	//le a dimensao do sistema

		System.out.println("Insira a dimensao do sistema: ");
		dim = leInteiroNoIntervalo(sc,1,1000);

		matriz = new int[dim][dim];


	//le a matriz
            for(int i=0; i<dim; i++){
                System.out.println("Linha " + (i+1));
                matriz[i] = leVector(sc,dim,0,1);
            }

            printMatriz(matriz);

            verSePermeavelVertical(matriz,dim);

            verSePermeavel(matriz,dim);


	}



        //               METODOS


	/**
	 *Le valor inteiro num intervalo dado
	 *@param sc - canal de leitura
	 *@param min - minimo admitido para o valor a ler
	 *@param max - maximo admitido para o valor a ler
	 *@return O numero lido
         */

	private static int leInteiroNoIntervalo(Scanner sc, int min, int max){
		int result = 0;
		do{
			result = sc.nextInt();
		}
		while (result < min || result > max);
		return result;
	}



	/**
	 * Le sequencia de inteiros que guarda num vector
	 * @param sc - canal de leitura
	 * @param dimensao - numero de inteiros a ler
	 * @param min - minimo admitido para os valores a ler
	 * @param max - maximo admitido para os valores a ler
	 * @return O vector com os numeros lidos
	 */

	private static int[] leVector(Scanner sc, int dimensao, int min,
                int max) {
            int[] result =  new int[dimensao];
            for (int i=0; i<result.length;i++){
                result[i]=leInteiroNoIntervalo(sc, min, max);
		}
            return result;
	}


	/**
	 * Imprime no ecra os elementos de uma matriz
	 * @param matriz -- a matriz a imprimir
	 * @requires matriz!=null && matriz matriz
	 */
	private static void printMatriz(int[][] matriz) {
		System.out.println("---------");
		for (int i=0; i<matriz.length; i++){
			for (int j=0; j<matriz[i].length; j++)
				System.out.print(" "+matriz[i][j]+" ");
			System.out.println();
		}
		System.out.println("---------");
	}








	/**
	 * Ve se uma matriz e permeavel na vertical e imprime a matriz inundada
	 * @param matriz -- a matriz a imprimir
	 * @param dimensao -- a dimensao do sistema
	 * @requires matriz!=null && matriz matriz && dimensao!=null
	 */

	private static void verSePermeavelVertical(int[][] matriz, int dimensao){

            int[][] vertical = new int[dimensao][dimensao];
            int[][] verticalaux = matriz;

//  copia os dados da primeira linha da matriz para a matriz inundada

            for(int i=0; i<dimensao; i++){
                vertical[0][i] = matriz[0][i];
            }

// inunda os pontos da matriz

            for(int i=0; i<dimensao-1; i++){
                for(int j=0; j<dimensao; j++){
                    if(vertical[i][j] == 1 && verticalaux[i+1][j] == 1)
            vertical[i+1][j] = 1;

                }
            }

// verifica se a matriz e permeavel ou nao

            for(int i=0;i<dimensao;i++){
                if(vertical[dimensao-1][i] == 1){
                    System.out.println("Sistema permeavel na vertical");
                    break;
                }
                else if((i == dimensao-1) && (vertical[dimensao-1][dimensao-1]==
                    0)){
                    System.out.println("Sistema impermeavel na vertical");
                }

            }

            printMatriz(vertical);
        }




	/**
         * Ve se uma matriz e permeavel e imprime a matriz inundada
         * @param aux -- copia da matriz dada
         * @param inundada -- matriz inundada
         * @requires aux!=null && aux matriz
	 */

        private static void verSePermeavel(int[][] aux, int dimensao){
			int[][] inundada = new int [dimensao][dimensao];
// copia os dados da primeira linha da matriz para a matriz inundada

            for(int i=0; i<dimensao; i++)
			inundada[0][i] = aux[0][i];

            for(int i=0; i<dimensao; i++){
			for(int j=0;j<dimensao-1;j++){

// verifica recursivamente se existem pontos inundaveis abaixo e a direita de
// um dado ponto inundado, da esquerda para a direita da matriz

				if(i!=dimensao-1){
                                    if(inundada[i][j]==1 && aux[i+1][j]==1)
							inundada[i+1][j] = 1;

                                    if(inundada[i][j]==1 && aux[i][(j+1)]==1)
							inundada[i][(j+1)] = 1;
				}

// excepcao para a ultima linha, de modo a nao ultrapassar os limites da matriz

				else{
                                    if(inundada[i][j] == 1 && aux[i][j+1] == 1)
							inundada[i][j+1] = 1;
				}
			}
// verifica recursivamente se existem pontos inundaveis abaixo e a esquerda de
// um dado ponto inundado, da direita para a esquerda da matriz, de modo a
// inundar pontos que possam ter sido negligenciados pelo for anterior

			for(int j=(dimensao-1);j>=0;j--){
                            if (j<=(dimensao-1) && j>0){
                                if(i!=dimensao-1){
                                    if(inundada[i][j]==1 && aux[i][j-1]==1){
                                        inundada[i][j-1] = 1;
                                    }
                                    if(inundada[i][j]==1 && aux[i+1][j]==1){
                                        inundada[i+1][j] = 1;
                                    }
                                }
                                else{
                                    if (inundada[i][j]==1 && aux[i][j-1]==1)
                                        inundada[i][j-1] = 1;
					}
                            }
                            if (j==0 && i!=dimensao-1){
                                if(inundada[i][0]==1 && aux[i+1][0]==1)
                                    inundada[i+1][0] = 1;
                            }
			}
            }
// verifica se a matriz e permeavel ou nao

            for(int i=0;i<dimensao;i++){
                if(inundada[dimensao-1][i] == 1){
                    System.out.println("Sistema permeavel");
                    break;
	    	}
	    	else if((i == dimensao-1) && (inundada[dimensao-1][dimensao-1]
                        == 0)){
                    System.out.println("Sistema impermeavel");
	   	}

            }

            printMatriz(inundada);
	}

}