zoj1002 Fire Net

  1. //zoj1002 Fire Net
  2. //Accepted 1002 C ++ 00:00.01 436K
  3. #include <stdio.h>
  4. int n;
  5. int max;
  6. char map[5][5];
  7. bool canput(int x, int y)
  8. {
  9.        int i,j;
  10.        if (map[x][y]!='.') return false;
  11.        for (i=x+1; i<n; i++){
  12.               if (map[i][y]=='X') break;
  13.               if (map[i][y]=='O') return false;
  14.        }
  15.        for (i=x-1; i>=0; i--){
  16.               if (map[i][y]=='X') break;
  17.               if (map[i][y]=='O') return false;
  18.        }
  19.        for (j=y+1; j<n; j++){
  20.               if (map[x][j]=='X') break;
  21.               if (map[x][j]=='O') return false;
  22.        }
  23.        for (j=y-1; j>=0; j--){
  24.               if (map[x][j]=='X') break;
  25.               if (map[x][j]=='O') return false;
  26.        }
  27.        return true;
  28. }
  29. bool finish()
  30. {
  31.        for (int i=0; i<n; ++i)
  32.               for (int j=0; j<n; ++j)
  33.                      if (canput(i,j))
  34.                             return false;
  35.        return true;
  36. }
  37. void backtrack(int num)
  38. {
  39.        if (finish()){
  40.               if (num>max) max = num;
  41.               return ;
  42.        }
  43.        for (int i=0; i<n; ++i)
  44.               for (int j=0; j<n; ++j)
  45.                      if (canput(i,j)){
  46.                             map[i][j] = 'O';
  47.                             backtrack(num+1);
  48.                             map[i][j] = '.';
  49.                      }
  50. }
  51. void solve()
  52. {
  53.        getchar();
  54.        for (int i=0; i<n; ++i){
  55.               for (int j=0; j<n; ++j)
  56.                      scanf ("%c",&map[i][j]);
  57.               getchar();
  58.        }
  59.        max = 0;
  60.        backtrack(0);
  61.        printf ("%d/n",max);
  62. }
  63. int main()
  64. {
  65. #ifdef ONLINE_JUDGE
  66. #else
  67.        freopen("1002.txt","r",stdin);
  68. #endif
  69.        while (scanf("%d",&n)!=EOF && n)
  70.               solve();
  71. #ifdef ONLINE_JUDGE
  72. #else
  73.        fclose(stdin);
  74. #endif
  75.        return 0;
  76. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值