JOJ 1017 FireNet

来源:互联网 发布:telnet 1433端口不通 编辑:程序博客网 时间:2024/04/28 21:30

题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1017

非常简单的回溯,没有用任何的限界函数就可以AC。代码如下:

 

  1. #include <cstdio>
  2. int n;
  3. char m[5][5];
  4. int ans, cn;
  5. bool ok(int i, int j) {
  6.     if(m[i][j] == 'X')
  7.     return false;
  8.     for(int t = j-1; t >= 1 && m[i][t] != 'X'; t--) {
  9.     if(m[i][t] == '*')
  10.         return false;
  11.     }
  12.     for(int t = i-1; t >= 1 && m[t][j] != 'X'; t--) {
  13.     if(m[t][j] == '*')
  14.         return false;
  15.     }
  16.     return true;
  17. }
  18.     
  19. void backtrack(int i, int j) {
  20.     if(i > n) {
  21.     if(cn > ans) {
  22.         ans = cn;
  23.     }
  24.     return;
  25.     }
  26.     if(ok(i, j)) {
  27.     m[i][j] = '*';
  28.     cn++;
  29.     if(j >= n) {
  30.         backtrack(i+1,1);
  31.     } else {
  32.         backtrack(i, j+1);
  33.     }
  34.     m[i][j] = '.';
  35.     cn--;
  36.     }
  37.     if(j >= n) {
  38.     backtrack(i+1, 1);
  39.     } else {
  40.     backtrack(i, j+1);
  41.     }
  42. }
  43. int main() {
  44.     freopen("in.txt""r", stdin);
  45.     while(scanf("%d", &n), n) {
  46.     for(int i = 1; i <= n; i++) {
  47.         scanf("%s", &m[i][1]);
  48.     }
  49.     ans = 0;
  50.     cn = 0;
  51.     backtrack(1,1);
  52.     printf("%d/n", ans);
  53.     }
  54.     return 0;
  55. }