2017-04-16 7 views
0

Je travaille actuellement sur le problème N Queens où l'entrée sera la taille de la matrice 2D et les valeurs réelles de la matrice 2D. Ce code vérifiera si oui ou non cette entrée est valide, car il n'y a pas d'autres reines qui s'entraident, ou si ce n'est pas le cas. Si c'est valide, imprimez simplement true sinon imprimez false. Je fais environ 95% de mon code, mais j'ai du mal à traverser la matrice 2D en diagonale. Je veux être en mesure de vérifier en diagonale NE, NW, SE, SW, mais je continue à obtenir un tableau hors limites sur mon code. Je sais pourquoi je continue à le faire, je ne sais pas comment le réparer. Je cherche des conseils sur la façon de résoudre ce problème. Voici mon code.Traversée d'une matrice 2D en diagonale de tous les côtés

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class nQueensMod { 

public static int r,c; 
public static int[][]board; 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    r = in.nextInt(); 
    c = in.nextInt(); 
    board = new int[r][c]; 
    for(int board_i=0; board_i < r; board_i++){ 
     for(int board_j=0; board_j < c; board_j++){ 
      board[board_i][board_j] = in.nextInt(); 
     } 
    } 

    System.out.println(solve(board,0,0)); 
} 

    public static boolean solve(int[][]board, int row, int col) 
    { 
     if(row >= r) 
     return true; 

     if(board[row][col] == 1) 
     { 
       if(validRows(row,col) && validCols(col,row)) 
       { 
       if(move(row,col)) 
        return true; 
       } 

      /*  
       if(validRows(row,col) && validCols(col,row) && validDiagonal(row,col)) 
       { 
       if(move(row,col)) 
        return true; 
       } 
      */ 
     } 

      else 
      { 
       if(move(row,col)) 
       return true; 
      } 

     return false; 
    } 

    public static boolean validRows(int row, int col) 
    { 
     for (int i = col + 1; i < r; i++) 
     { 
     if (board[row][i] == 1) 
     { 
      return false; 
     } 
     } 

     return true; 
    } 

    public static boolean validCols(int cols, int row) 
    { 
     for (int i = row + 1; i < c; i++) 
     { 
     if (board[i][cols] == 1) 
     { 
      return false; 
     } 
     } 

     return true; 
    } 

/*  
    public static boolean validDiagonal(int row, int cols) 
    { 
     for (int i = 1; i < c; i++) 
     { 

     if (
       //checks SE 
       board[row + i][cols + i] == 1 || 
       //checks SW 
       board[row + i][cols - i] == 1 || 
       //checks NE 
       board[row - i][cols + i] == 1 || 
       //checks NW 
       board[row - i][cols - i] == 1 
      ) 

       return false; 
     } 

     return true; 
    } 
*/  
    public static boolean move(int row,int col) 
    { 
     if(col < board.length - 1) 
      return solve(board,row, col + 1); 

      else 
       return solve(board,row + 1, 0); 
    } 
} 

j'ai commenté la méthode validDiagonal réelle parce que ce que j'ai essayé, mais je continue à obtenir le tableau hors d'exception des limites. Voilà la première partie ont besoin d'aide. Voici un exemple de l'entrée

4 4 
0 1 0 0 
0 0 0 1 
1 0 0 0 
0 0 1 0 

et sortie

True 

Ceci est l'erreur que je reçois

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
at nQueensMod.validDiagonal(nQueensMod.java:88) 
at nQueensMod.solve(nQueensMod.java:40) 
at nQueensMod.move(nQueensMod.java:108) 
at nQueensMod.solve(nQueensMod.java:50) 
at nQueensMod.main(nQueensMod.java:23) 

C'est la première fois poster ici donc j'espère que j'ai posté la question dans le bon sens. Merci d'avance les gars!

+0

Avez-vous parcouru le code dans votre débogueur? Qu'as-tu trouvé? Pourquoi n'avez-vous pas inclus la trace de la pile dans votre message? S'il vous plaît visitez [help] et lisez [ask] pour apprendre comment utiliser ce site efficacement. –

+0

@JimGarrison Oui, j'ai utilisé mon débogueur, il dit qu'il sort de la limite (-1) quand il frappe le premier 1 sur la ligne [0] col [1]. Je sais que cela se produit parce que lorsque la ligne [row - 1] [cols + 1] == 1 est appelée row est déjà à 0, 0 - 1 = -1, ce qui signifie que c'est l'exception hors-limite du tableau. Comme je l'ai dit dans ma question, je sais quel est le problème, j'ai juste besoin de conseils sur la façon de le réparer. – Rcordero

+0

Désolé, ce n'est pas comme ça que fonctionne StackOverflow. Nous n'allons pas réécrire votre code pour gérer les conditions aux limites, c'est quelque chose dont vous aurez besoin pour vous attaquer vous-même. –

Répondre

0

Vous devez vérifier si vos index sont à portée avant d'accéder à la matrice.

Je vais vous donner un indice,

// for NW 
if (row-i>0 && col-i>0 && board[row - 1][cols - 1] == 1) 
    return true 

Est-ce que vous voyez pourquoi il y a un IndexOutOfBoundException?

+0

Oh! ok, je l'ai! Il retournera faux mais en raison de la planche [row - 1] [cols - 1] == 1. Je n'étais pas sûr de la façon de vérifier si c'était hors limites en premier, mais c'est logique! Merci! – Rcordero

+0

Oui, cela vaut pour tout accès à l'index. Vérifiez simplement si l'index se trouve dans la plage avant de faire l'accès. – abhipil

+0

J'ai compris! J'apprécie ton aide. J'ai été capable d'ajuster tous les contrôles à cause de cela et maintenant mon programme fonctionne comme un charme. Merci encore! – Rcordero