2010-07-09 11 views
6

Pracuję nad programem N Queens, który pozwoli użytkownikowi wprowadzić konfigurację Queen jako ciąg. Na przykład po wyświetleniu monitu użytkownik może wpisać coś w stylu Q .... Q ..... Q..Q. która wyświetlana jako tablica będzie wyglądać następująco:Potrzebujesz pomocy z programem N Queens (sprawdzanie przekątnych)

Q . . . 
. Q . . 
. . . Q 
. . Q . 
Is not a solution! 

Ten program jest prosty, ponieważ zakłada, że ​​użytkownik wprowadzi prawidłowe informacje. Chciałbym, aby główna część programu działała, zanim wrócę i dodam obsługę błędów.

Dla tych, którzy nie są zaznajomieni z układanką N Queens, w zasadzie macie N Queens na tablicy N x N. Masz jedną królową w rzędzie. Wypełniona plansza jest rozwiązaniem, jeśli żadna z dwóch królowych nie ma tego samego rzędu, kolumny lub przekątnej.

Pomyślnie zaimplementowałem sprawdzanie wierszy i kolumn. Jednak jestem zaskoczony, w jaki sposób mogę sprawdzić wszystkie przekątne. Wiem, jak sprawdzić dwie główne przekątne, np. W kółko i krzyżyk, ale naprawdę nie mogę sobie wyobrazić, jak mogę sprawdzić wszystkie możliwe przekątne?

Czy ktoś może zaoferować pomoc?

Oto mój kod:

import java.util.Scanner; 
public class NQueens { 


    public static void main(String[] args) { 

     Scanner sc = new Scanner(System.in); 
     int qCount; 
     boolean solution = true; 


     System.out.println("Enter the String to test:"); 
     board = sc.nextLine(); 

     int boardLen = board.length(); 
     int maxDim = (int) Math.sqrt(boardLen); 
     char[][] gameBoard = new char[maxDim][maxDim]; 


     int counter = 0; 
     for (int i = 0; i < maxDim; i++) 
     { 
      for (int j = 0; j < maxDim; j++) 
      { 
       gameBoard[ i ][ j ] = board.charAt(counter); 
       counter++; 
      } 

     } 


     System.out.println(""); 
     System.out.println(""); 




    //check rows  

    for (int i = 0; i < maxDim; i++) 
    { 
     int queenCount = 0; 

     for (int j = 0; j < maxDim; j++) 
     { 
      if (gameBoard[ i ][ j ] == 'Q') 
      { 
       queenCount++; 


       if (queenCount > 1) 
       { 
        solution = false; 
        break; 

       } 


      } 


     } 

    } 


    // check columns 

    for (int i = 0; i < maxDim; i++) 
    { 
     int queenCount = 0; 

     for (int j = 0; j < maxDim; j++) 
     { 
      if (gameBoard[ j ][ i ] == 'Q') 
      { 
       queenCount++; 

       if (queenCount > 1) 
       { 
        solution = false; 
        break; 
       } 
      } 
     } 
    } 


    // print the board 

    for(int i = 0; i < maxDim; i++) 
    { 
     for (int j = 0; j < maxDim; j++) 
     { 
      System.out.print(gameBoard[ i ][ j ] + " "); 
     } 

     System.out.println(); 

    } 

    // print whether or not the placement of queens is a solution 
    if (solution) 
    { 
     System.out.println("Is a solution!"); 

    } 

    else 
    { 
     System.out.println("Is not a solution!"); 

    } 

    }//end main 

}//end class 

Dzięki Więcej: Potrzebujesz pomocy z N Queens Program

Odpowiedz

19

nie sądzę chcesz sprawdzić wszystkie przekątne, ale można sprawdzić wszystkie królowe zamiast tego. Możesz sprawdzić, czy dwie królowe są na tej samej przekątnej, sprawdzając różnice między wierszami i kolumnami dwóch Qs. Jeśli różnice są takie same, są na tej samej przekątnej. (Zasadniczo, jeśli nachylenie linii między dwoma królowymi wynosi + -1, są one na tej samej przekątnej.)

Załóżmy na przykład, że masz dwie królowe Q1 i Q2. Oblicz bezwzględną wartość różnic w ich wierszach i kolumnach.

deltaRow = abs(Q1 row - Q2 row) 
deltaCol = abs(Q1 col - Q2 col) 

Jeśli królowe są na tej samej przekątnej.

Po prostu zrób to dla wszystkich N królowych.

+1

W gruncie rzeczy mówisz, że mogę przechowywać wartości xiy każdej królowej w innej tablicy 2d, a następnie wykonać test, który zilustrowałeś? – Codebug

+1

@Will: Tak, po prostu zapisz X i Y dla każdej królowej i wykonaj sprawdzenie dla każdej pary. –

+2

Czy nie potrzebujesz tutaj bezwzględnej wartości? – shinzou

1

Przekątne mogą być wyrażone w postaci y = x + c lub y = c - x. Twoja plansza 4x4 będzie miała łącznie 10 przekątnych, po 5 dla każdego równania. Wyobraźmy c (różnią się w zależności od rozmiaru planszy) i pętlę na x, obliczyć y.

Musisz sprawdzić współrzędne mniejsze od zera, górne ograniczenia można uniknąć, po prostu zwiększając rozmiar planszy 2x (w każdym kierunku) w razie potrzeby - pozostałe kwadraty są zawsze puste, więc sprawdzenie ich powoduje bez szkody.

Wprowadziłem nawet problem N queens bez tablicy - śledzenie wierszy, kolumn i przekątnych. W tym czasie było to szybsze, ponieważ dodawanie było o wiele szybsze niż mnożenie, ale tak już nie jest.

2

Można powiedzieć, że królowe są na tej samej przekątnej, jeśli nachylenie linii łączącej 2 królowe wynosi 1 lub -1.

Niech q1 i q2 być struktury danych posiadających X i Y położenia każdej królowej:

xDistance = q1.x - q2.x

yDistance = q1.y - q2.y

slope = xDistance/yDistance

Więc if (slope.abs() == 1) następnie są one na tej samej przekątnej.

+0

To jest trochę niebezpieczne, jeśli podzielisz liczby całkowite, możesz otrzymać 1 od 3/2. – shinzou

Powiązane problemy