Advertisement
franji

Untitled

Mar 30th, 2020
459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.07 KB | None | 0 0
  1. package il.ac.tau.cs.franji;
  2.  
  3.  
  4. /**
  5.  * Created by talfranji on 30/03/2020.
  6.  */
  7. public class Main {
  8.     static final String game =
  9.             " _ _ 4  _ _ _  _ 5 7 " +
  10.                     " 2 _ _  _ _ _  8 _ _ " +
  11.                     " 3 9 _  5 _ _  _ _ 6" +
  12.  
  13.                     " _ 1 _  4 7 5  9 _ _" +
  14.                     " _ _ _  _ 3 _  _ _ _" +
  15.                     " _ _ 5  2 1 8  _ 3 _" +
  16.  
  17.                     " 7 _ _  _ _ 9  _ 4 8" +
  18.                     " _ _ 9  _ _ _  _ _ 3" +
  19.                     " 1 8 _  _ _ _  2 _ _";
  20.  
  21.     static final String gameTest =
  22.             "_ 2 3  4 5 6  7 8 9\n" +
  23.                     "_ 5 _  _ _ _  _ _ _\n" +
  24.                     "_ 6 _  _ _ _  _ _ _\n" +
  25.                     "\n" +
  26.                     "_ 3 _  _ _ _  _ _ _\n" +
  27.                     "_ 4 _  _ _ _  _ _ _\n" +
  28.                     "_ 7 _  _ _ _  _ _ _\n" +
  29.                     "\n" +
  30.                     "_ 8 _  _ _ _  2 3 4\n" +
  31.                     "_ 9 _  _ _ _  5 6 7\n" +
  32.                     "_ _ _  _ _ _  8 9 _\n";
  33.  
  34.     static int[][][] BoardFromInput(String game) {
  35.         int[][][] res = new int[9][][];
  36.         int x = 0;
  37.         int y = 0;
  38.         for(char ch :game.toCharArray()) {
  39.             int[] item = null;
  40.             if (Character.isDigit(ch)) {
  41.                 // constatnt cell
  42.                 item = new int[]{1, Character.getNumericValue(ch)};
  43.             } else if (ch == '_') {
  44.                 item = new int[]{0, -1};  // empty cell
  45.             } else {
  46.                 // not a digit and not empty cell.
  47.                 continue;
  48.             }
  49.  
  50.             if (res[y] == null) {
  51.                 res[y] = new int[9][];  // start new line
  52.             }
  53.             res[y][x] = item;
  54.             x += 1;
  55.             if (x >= 9) {
  56.                 y += 1;
  57.                 x = 0;
  58.             }
  59.             if (y >= 9) {
  60.                 break;  //exit even if mnore chars in string
  61.             }
  62.         }
  63.         return res;
  64.     }
  65.     static String repeat(String s, int n) {
  66.         String res = "";
  67.         for (int i = 0; i < n; i++) {
  68.             res += s;
  69.         }
  70.         return res;
  71.     }
  72.  
  73.     static void PrintBoard(int[][][] board) {
  74.         int y = -1; //line index
  75.         for (int[][] line : board) {
  76.             y += 1;
  77.             if (y % 3 == 0) {
  78.                 System.out.println(repeat("-",37));
  79.             }
  80.             int x = -1;
  81.             for (int[] item : line) {
  82.                 x += 1;
  83.                 if (x % 3 == 0) {
  84.                     System.out.print(" | ");
  85.                 }
  86.                 if (item[1] >= 0) {
  87.                     System.out.format("%2d ", item[1]);
  88.                 } else {
  89.                     System.out.print(" _ ");
  90.                 }
  91.             }
  92.             System.out.println("");  // end of line
  93.         }
  94.         System.out.println(repeat("=",37));
  95.     }
  96.  
  97.  
  98.     static boolean inLine(int n, int[][][] board, int line) {
  99.         for(int[] item: board[line]) {
  100.             if (n == item[1]) {
  101.                 return true;
  102.             }
  103.         }
  104.         return false;
  105.     }
  106.  
  107.     static boolean inCol(int n, int[][][] board, int col) {
  108.         for(int[][] line: board) {
  109.             if (n == line[col][1]) {
  110.                 return true;
  111.             }
  112.         }
  113.         return false;
  114.     }
  115.  
  116.     static boolean inSq(int n, int[][][] board, int line, int col) {
  117.         int sqY = line / 3;
  118.         int sqX = col / 3;
  119.         for(int l = sqY * 3; l < sqY * 3 + 3; l++) {
  120.             for (int c = sqX * 3; c < sqX * 3 + 3; c++) {
  121.                 if (n == board[l][c][1]) {
  122.                     return true;
  123.                 }
  124.             }
  125.         }
  126.         return false;
  127.     }
  128.  
  129.  
  130.  
  131.     static boolean Solve(int[][][] board, int i) {
  132.         PrintBoard(board);
  133.         if (i >= 9 * 9) {
  134.             return true;
  135.         }
  136.         int line = i / 9;
  137.         int col = i % 9;
  138.         if (board[line][col][0] == 1) {
  139.             return Solve(board, i + 1);
  140.         }
  141.         for (int n = 1; n <= 9; n++) {
  142.             board[line][col][1] = -1;
  143.             boolean line_bad = inLine(n, board, line);
  144.             boolean row_bad = inCol(n, board, col);
  145.             boolean sq_bad = inSq(n, board, line, col);
  146.             if (line_bad || row_bad || sq_bad) {
  147.                 continue;
  148.             }
  149.             board[line][col][1] = n;
  150.             if (Solve(board, i + 1)) {
  151.                 return true;
  152.             }
  153.             board[line][col][1] = -1;  // restore
  154.         }
  155.         return false;
  156.     }
  157.  
  158.  
  159.  
  160.     static void test() {
  161.         // assert need VM option -ea in Run configurations
  162.         int[][][] board = BoardFromInput(gameTest);
  163.         assert inLine(2, board, 0);
  164.         assert !inLine(1, board, 0);
  165.         assert inCol(2, board, 1);
  166.         assert !inCol(1, board, 1);
  167.         assert inSq(2, board, 8, 8);
  168.         assert !inSq(1, board, 8, 8);
  169.     }
  170.  
  171.  
  172.     public static void main(String[] args) {
  173.         int[][][] board = BoardFromInput(game);
  174.         PrintBoard(board);
  175.         Solve(board, 0);
  176.         //test();
  177.     }
  178.  
  179.  
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement