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 }

 

posted @ 2013-03-26 10:56  rqg  阅读(112)  评论(0编辑  收藏  举报