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);
}
}