Exception in thread "main" java.lang.StackOverflowError

1 resposta
J

Bom!
Eu fiz um trabalho, N Rainhas com Backtraking. Ele resolve até a a quantidade 7 de rainhas, com 8 ele da erro.

[color=black]Exception in thread "main" java.lang.StackOverflowError[/color]

Acho que ta chamando muitas veses as funções!!

Alguem me ajuda resolver isso!!!

Meu codigo é esse! :lol:

package nrainhas;

import javax.swing.JOptionPane;

/**
 *
 * @author Jaderson
 */
public class NRainhas2 {
     int r=1,i=0, w=1,x=0;
     int quant;
     int filho[] = null;
     int armz[] = null;

public NRainhas2(){
        start(r);

}

public void start(int r){
    String rainhas = JOptionPane.showInputDialog("Digite a quantidade de rainhas.");
    if(rainhas.equals("")){
        System.out.println("Você não digito nenhum numero.");
    System.exit(0);
    }
    quant = Integer.parseInt(rainhas);
        if( quant <= 3){
        System.out.println("Digite um numero maior que 3.");
        System.exit(0);
        }
    filho = new int [quant];
    armz = new int[quant];
    filho[0]=r;
    armz[0]=r;
    rainhas(filho, r);
}

private void rainhas(int filho[], int r){

   for(int cont=0;cont<=armz.length-1;cont++){

       if(r>quant){
       //System.out.println("R é maior quant. Valor de r é: "+r+"Valor de i é: "+i);
       armz[i]=0;
       r=filho[i];
       r++;
       filho[i]=0;
           if(i>0)
            i--;

       backtreking(filho, r);
    }
        if(r==armz[cont]){
         // System.out.println("R ja foi inserido."+r);
            r++;
          cont=-1;
       }
           
   }
   ConfDiagonal(filho, r);
}

private void ConfDiagonal(int filho[], int r){
    w=i+1;
    for(int cont = 0; cont<=i+1; cont ++){
        if((r==filho[cont]-w)||(r==filho[cont]+w)){
            //System.out.println(armz[0]+""+armz[1]+""+armz[2]+""+armz[3]);
            //System.out.println("Dá choeque na diagonal. Valor de r é: "+r+"Valor de i é: "+i);
            r++;
            
            backtreking(filho, r);
        }
    w--;
    }
        if(filho[0]!=0)
        i++;
        insere(filho, r);
}

public void backtreking(int filho[], int r){
    //System.out.println("filho ná posição 0 é: "+ filho[0]+" filho na posição 7 é: "+ filho[quant-1]+" e R é: " + r);
    if((filho[0]==0)&&(filho[quant-1]==0)&&(r==quant+1)){
        System.exit(0);
    }

    rainhas(filho, r);
}

private void insere(int[] filho, int r) {
    filho[i]=r;
        if(filho[quant-1]!=0){
        x++;
        System.out.println("------------RESPOSTA------------ "+x);
       
        for(int cont=0;cont<=filho.length-1;cont++)
            System.out.print((filho[cont])+("|"));
       // System.out.println(filho[0]+"|"+filho[1]+"|"+filho[2]+"|"+filho[3]+"|"+filho[4]+"|"+filho[5]+"|"+filho[6]+"|"+filho[7]);
        System.out.print("\n");
        }
    
    armz[i]=r;
    r=1;
    
    rainhas(filho, r);
}

}

1 Resposta

J

Já resolvi aumentando o tamanho da Stack. xD

Criado 3 de dezembro de 2010
Ultima resposta 7 de dez. de 2010
Respostas 1
Participantes 1