Advertisement
rafikamal

Untitled

May 31st, 2015
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.09 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.Scanner;
  5.  
  6. public class Solver {
  7.     private int N;
  8.     private BlockType[][] board;
  9.     private boolean[] visitedVariables;
  10.     private Integer[] assignments;
  11.     private ArrayList<Integer[]> solutions;
  12.    
  13.     public Solver(int N) {
  14.         this.N = N;
  15.         board = new BlockType[N][N];
  16.         assignments = new Integer[N];
  17.         visitedVariables = new boolean[N];
  18.         solutions = new ArrayList<Integer[]>();
  19.        
  20.         csp();
  21.     }
  22.    
  23.     private void csp() {
  24.         Integer v = getNextUnvisitedVariable();
  25.         if (v == null)  {
  26.             // No unassigned variables, found a solution
  27.             solutions.add(Arrays.copyOf(assignments, assignments.length));
  28.            
  29.             for (int i = 0; i < N; i++)
  30.                 assert(isAssignmentValid(i, assignments[i]));
  31.         }
  32.         else {
  33.             visitedVariables[v] = true;
  34.            
  35.             for (int i = 0; i < N; i++) {
  36.                 if (isAssignmentValid(v, i)) {
  37.                     board[v][i] = BlockType.Q;
  38.                     assignments[v] = i;
  39.                     List<BoardPosition> conflictedPositions = forwardChecking(v, i);
  40.                     csp();
  41.                     undoForwardChecking(conflictedPositions);
  42.                     assignments[v] = null;
  43.                     board[v][i] = BlockType.None;
  44.                 }
  45.             }
  46.            
  47.             visitedVariables[v] = false;
  48.         }
  49.     }
  50.    
  51.     private Integer getNextUnvisitedVariable() {
  52.         int minimumRemainingValue = Integer.MAX_VALUE;
  53.         Integer minimumRemainingValueNode = null;
  54.        
  55.         for (int i = 0; i < visitedVariables.length; i++) {
  56.             if (!visitedVariables[i]) {
  57.                 int remaninigValue = getRemainingValue(i);
  58.                 if (remaninigValue < minimumRemainingValue) {
  59.                     minimumRemainingValue = remaninigValue;
  60.                     minimumRemainingValueNode = i;
  61.                 }
  62.             }
  63.                
  64.         }
  65.        
  66.         return minimumRemainingValueNode;
  67.     }
  68.    
  69.     private List<BoardPosition> forwardChecking(int row, int col) {
  70.         List<BoardPosition> conflictedPositions = new ArrayList<BoardPosition>();
  71.         for (int i = 0; i < N; i++) {
  72.             if (i == row)
  73.                 continue;
  74.             checkBord(i, col, conflictedPositions);
  75.             checkBord(i, col - (row - i), conflictedPositions);
  76.             checkBord(i, col + (row - i), conflictedPositions);
  77.         }
  78.        
  79.         return conflictedPositions;
  80.     }
  81.    
  82.     private void undoForwardChecking(List<BoardPosition> conflictedPositions) {
  83.         for (BoardPosition boardPosition : conflictedPositions) {
  84.             board[boardPosition.row][boardPosition.col] = BlockType.None;
  85.         }
  86.     }
  87.    
  88.     private void checkBord(int row, int col, List<BoardPosition> conflictedPositions) {
  89.         if (isValidPosition(row, col) && board[row][col] == BlockType.None) {
  90.             board[row][col] = BlockType.X;
  91.             conflictedPositions.add(new BoardPosition(row, col));
  92.         }
  93.     }
  94.    
  95.     private int getRemainingValue(int row) {
  96.         int remainingValues = 0;
  97.         for (int i = 0; i < N; i++) {
  98.             if (board[row][i] == BlockType.X)
  99.                 remainingValues++;
  100.         }
  101.        
  102.         return remainingValues;
  103.     }
  104.    
  105.     private boolean isAssignmentValid(int row, int col) {
  106.         for (int i = 0; i < N; i++) {
  107.             if (i == row)
  108.                 continue;
  109.             if (board[i][col] == BlockType.Q)
  110.                 return false;
  111.            
  112.             if (isValidPosition(row, col - (row - i)) && board[i][col - (row - i)] == BlockType.Q)
  113.                 return false;
  114.            
  115.             if (isValidPosition(row, col + (row - i)) && board[i][col + (row - i)] == BlockType.Q)
  116.                 return false;
  117.         }
  118.        
  119.         return true;
  120.     }
  121.    
  122.     private boolean isValidPosition(int row, int col) {
  123.         return row >= 0 && row < N && col >= 0 && col < N;
  124.     }
  125.    
  126.     public ArrayList<Integer[]> getSolutions() {
  127.         return solutions;
  128.     }
  129.    
  130.     public static void main(String[] args) {
  131.         Scanner scanner = new Scanner(System.in);
  132.         int N = scanner.nextInt();
  133.        
  134.         Solver solver = new Solver(N);
  135.        
  136.         for (Integer assignment : solver.getSolutions().get(0))
  137.             System.out.print((assignment + 1) + " ");
  138.         System.out.println();
  139.         System.out.println(solver.getSolutions().size());
  140.        
  141.         for (Integer[] solution : solver.getSolutions()) {
  142.             for (Integer assignment : solution)
  143.                 System.out.print((assignment + 1) + " ");
  144.             System.out.println();
  145.         }
  146.     }
  147.    
  148.     public enum BlockType {Q, None, X}
  149.  
  150.     public class BoardPosition {
  151.         public int row;
  152.         public int col;
  153.        
  154.         public BoardPosition(int row, int col) {
  155.             this.row = row;
  156.             this.col = col;
  157.         }
  158.        
  159.     }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement