[uva] 639 Don't Get Rooked

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=580

好几天没刷题, 罪过= =看推理动漫, 玩编程游戏去了= =

又是简单回溯, 注意和8皇后的区别.

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 #define MAX_SIZE 10
 7 int gn = 0;
 8 char gmap[MAX_SIZE][MAX_SIZE] = {0};
 9 int gmax = 0;
10 
11 void dfs(int cur, int num) {
12     if (cur == gn * gn) {
13         if (num > gmax) {
14             gmax = num;
15         }
16         return;
17     }
18     int x = cur / gn;
19     int y = cur % gn;
20     int flagx = 0;
21     for (int i = x - 1; i >= 0; --i) if (gmap[i][y] != 'X') {
22         if (gmap[i][y] == 'O') {
23             flagx = 1;
24             break;
25         }
26     } else {
27         break;
28     }
29     int flagy = 0;
30     for (int i = y - 1; i >= 0; --i) if (gmap[x][i] != 'X') {
31         if (gmap[x][i] == 'O') {
32             flagy = 1;
33             break;
34         }
35     } else {
36         break;
37     }
38     if (!flagx && !flagy && gmap[x][y] != 'X') {
39         gmap[x][y] = 'O';
40         dfs(cur + 1, num + 1);
41         gmap[x][y] = '.';
42         dfs(cur + 1, num);
43     } else {
44         dfs(cur + 1, num);
45     }
46 }
47 
48 int main(int argc, const char * argv[])
49 {
50     while (scanf("%d\n", &gn)) {
51         if (gn == 0) {
52             break;
53         }
54         gmax = 0;
55         for (int i = 0; i < gn; ++i) {
56             for (int j = 0; j < gn; ++j) {
57                 scanf("%c", &gmap[i][j]);
58             }
59             getchar();
60         }
61         dfs(0, 0);
62         printf("%d\n", gmax);
63     }
64     return 0;
65 }

 

posted @ 2013-12-21 01:10  NextLife  阅读(306)  评论(0)    收藏  举报