zoj1002
1 import java.util.Scanner; 2 3 public class Main { 4 static int max = 0; 5 6 static boolean canPut(int x, int y, char[] board, int n) { 7 // up 8 for (int i = x - 1; i >= 0; i--) { 9 if (board[i * n + y] == 'O') 10 return false; 11 else if (board[x * n + i] == 'X') 12 break; 13 } 14 // left 15 for (int i = y - 1; i >= 0; i--) { 16 if (board[x * n + i] == 'O') 17 return false; 18 else if (board[x * n + i] == 'X') 19 break; 20 } 21 return true; 22 } 23 24 static void find(char[] board, int k, int currMax, int n) { 25 if (k == n * n) { 26 if (currMax > max) 27 max = currMax; 28 return; 29 } else { 30 if (board[k] == '.' && canPut(k / n, k % n, board, n)) { 31 board[k] = 'O'; 32 find(board, k + 1, currMax + 1, n); 33 board[k] = '.'; 34 } 35 find(board, k + 1, currMax, n); 36 } 37 } 38 39 public static void main(String[] args) { 40 Scanner sc = new Scanner(System.in); 41 int n; 42 43 while ((n = sc.nextInt()) != 0) { 44 char[] board = new char[n * n]; 45 46 // get board 47 for (int i = 0; i < n; i++) { 48 String stmp = sc.next(); 49 char[] ctmp = stmp.toCharArray(); 50 for (int j = 0; j < n; j++) { 51 board[i * n + j] = ctmp[j]; 52 } 53 } 54 55 find(board, 0, 0, n); 56 57 System.out.println(max); 58 max = 0; 59 } 60 } 61 }