Olá,
Criei um programa que lê uma matriz quadrada e com a ordem dessa matriz determina todas as sequencias possiveis. Por exemplo, se a ordem da matriz for 4 determina todas combinaçoes com os numeros 0, 1, 2, 3.
Sendo que os numeros das combinações correspondem a posiçoes na matriz inserida. Para cada combinação o programa faz a soma maxima dos elementos da matriz.
O programa já cria todas as sequencias e descobre a soma maxima. Mas nao guarda a sequencia correspondente à soma maxima.
O codigo é o seguinte:
package mdisc;
import java.io.PrintStream;
import java.math.BigInteger;
import java.util.Random;
import java.util.Scanner;
/**
*
* @author
*/
public class MDISC {
public static void main(String[] args) {
MDISC programa = new MDISC();
programa.menu();
}
private final Scanner entrada = new Scanner(System.in);
private final PrintStream saida = System.out;
private static int[][] matriz;
private static int[] p;
private static int somaMax;
private static int[] seq;
/**
* Executa este programa
*/
public void executarMatrizInserida(){
// Introdução dos valores da matriz no formato x,y,z,...
saida.println("Introduza os valores no formato A,B,C,D: ");
saida.println(" A B ");
saida.println(" C D ");
saida.println("Valores: ");
String stringDeNumeros = entrada.nextLine();
// converte a string para um vetor de strings
String[] vetorString = stringDeNumeros.split(",");
int[] vetorInt = stringsParaInts(vetorString);
saida.println("Matriz introduzida: ");
// converte o vetor para uma matriz
matriz = converteVetorEmMatriz(vetorInt);
int ordem = matriz.length;
int v[] = new int[ordem];
for (int y=0; y<ordem; y++){
v[y]=y;
}
// imprime a matriz
imprimirMatriz(matriz);
permuta1(v);
// sequencia
System.out.println("Valor máximo: " + somaMax);
System.out.println("Sequencia com soma máxima: " );
for (int y=0; y<seq.length;y++) System.out.print(seq[y] + " ");
menu();
}
private void permuta(int []vet, int n) {
if (n==vet.length) {
sequencias();
} else {
for (int i=0; i < vet.length; i++) {
boolean enc = false;
for (int j = 0; j < n; j++) {
if (p[j]==vet[i]) enc = true;
}
if (!enc) {
p[n] = vet[i];
permuta(vet,n+1);
}
} //--for
} //--if/else
}
public void permuta1(int [] vet) {
p = new int[vet.length];
permuta(vet,0);
}
public void sequencias(){
int soma=0;
for (int i=0; i < p.length; i++) {
if ( i+1==p.length){
soma=soma+matriz[p[0]][p[p.length-1]];
}
else {
soma=soma+matriz[p[i]][p[i+1]];
}
somaMaximaSeq(soma);
}
}
public void somaMaximaSeq(int soma){
seq = new int[p.length];
if (soma<somaMax){
somaMax=soma;
for (int i=0; i < p.length; i++) {
seq[i]=p[i];
}
}
}
public void executarMatrizAleatoria(){
saida.println(" ");
saida.println("Insira a ordem da matriz a gerar: ");
int ordem = Integer.parseInt(entrada.nextLine());
// gerar matrizes aleatoriamente com valores entre [0,100] com as diagonais em zero.
int[][] matrizAleatoria = gerarMatriz(ordem, 100);
saida.println(" ");
// Imprimir matriz gerada aleatoriamente
saida.println("Matriz gerada aleatoriamente de ordem " + ordem + ":");
saida.println(" ");
imprimirMatriz(matrizAleatoria);
int v[] = new int[ordem];
for (int y=0; y<ordem; y++){
v[y]=y;
}
permuta1(v);
// Sequencia da matriz
//int [] seq = sequencia(ordem, 2);
System.out.println(" ");
System.out.println("Soma máxima: " + somaMax);
System.out.println(" ");
System.out.println("Sequencia com soma máxima: " );
for (int y=0; y<seq.length;y++) System.out.print(seq[y] + " ");
menu();
}
public void menu(){
Scanner ler2 = new Scanner(System.in);
System.out.println(" ");
System.out.println("Insira a operação que deseja efetuar:");
System.out.println(" ");
System.out.println("1 - Matriz inserida e sequencia e soma máxima ");
System.out.println("2 - Matriz aleatoria e sequencia e soma máxima ");
System.out.println("3 - Fatorial");
System.out.println("4 - Sair");
System.out.println(" ");
System.out.print("Insira a opção: ");
int opcao = ler2.nextInt();
System.out.println(" ");
switch(opcao){
case (1):
executarMatrizInserida();
break;
case (2):
executarMatrizAleatoria();
break;
case (3):
executarFatorial();
break;
case (4):
System.exit(0);
break;
}
}
/*
* Converte o vetor anteriormente convertido em int para uma matriz quadrada
*/
private int[][] converteVetorEmMatriz(int[] vetor) {
int ordem = (int) Math.sqrt(vetor.length);
matriz = new int[ordem][ordem];
try {
int posicao = 0;
for (int linha = 0; linha < ordem; linha++) {
for (int coluna = 0; coluna < ordem; coluna++) {
matriz[linha][coluna] = vetor[posicao++];
}
}
} catch (ArrayIndexOutOfBoundsException e) {
saida.println("Erro: Não introduziu valores correspondentes a uma matriz quadrada! " + e);
}
return matriz;
}
public void executarFatorial(){
System.out.println("Insira um valor: ");
int valor = entrada.nextInt();
try {
System.out.println(fatorial(valor));
} catch (ArrayIndexOutOfBoundsException e) {
saida.println("Erro: Não introduziu valores correspondentes a uma matriz quadrada! " + e);
}
menu();
}
/*
* Calcula o fatorial de um valor. Utilizamos o bigInteger para permitir calcular valores elevados
*/
private BigInteger fatorial(int valor) {
BigInteger factorial = new BigInteger("1");
for (int i = 1; i <= valor; i++) {
factorial = factorial.multiply(new BigInteger(i + ""));
}
return factorial;
}
/**
* Gerar matrizes de ordem informada aleatoriamente com valores entre 0 e o 100, com as diagonais em zero.
*/
private int[][] gerarMatriz(int ordem, int limite) {
Random gerador = new Random();
matriz = new int[ordem][ordem];
for (int linha = 0; linha < ordem; linha++) {
for (int coluna = 0; coluna < ordem; coluna++) {
if (linha == coluna){
matriz[linha][coluna] = 0;
}
else {
int ger = gerador.nextInt(limite);
matriz[linha][coluna]=ger;
matriz[coluna][linha]=ger;
}
}
}
return matriz;
}
/**
* Imprime a matriz passada pelo parametro
*/
private void imprimirMatriz(int[][] matriz) {
for (int linha = 0; linha < matriz.length; linha++) {
for (int coluna = 0; coluna < matriz[linha].length; coluna++) {
String espaco = matriz[linha][coluna] < 10 ? " " : " ";
saida.print(espaco + matriz[linha][coluna] + espaco);
}
saida.println(" ");
}
}
/**
* Converte um array de String para um array de inteiros
*/
private int[] stringsParaInts(String[] strings) {
int ints[] = new int[strings.length];
try {
for (int i = 0; i < strings.length; ++i) {
ints[i] = Integer.parseInt(strings[i].trim());
}
} catch (NumberFormatException e) {
saida.println("Erro: Não introduziu apenas numeros! " + e);
}
return ints;
}
}
O codigo correspondente a fazer a soma maxima é o seguinte:
public void sequencias(){
int soma=0;
for (int i=0; i < p.length; i++) {
if ( i+1==p.length){
soma=soma+matriz[p[0]][p[p.length-1]];
}
else {
soma=soma+matriz[p[i]][p[i+1]];
}
somaMaximaSeq(soma);
}
}
public void somaMaximaSeq(int soma){
seq = new int[p.length];
if (soma<somaMax){
somaMax=soma;
for (int i=0; i < p.length; i++) {
seq[i]=p[i];
}
}
}
Alguem me consegue ajudar a guardar na seq a seuqencia com a primeira maior soma? Obrigado