superman

聚精会神搞建设 一心一意谋发展
posts - 190, comments - 17, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Section 2.4 - Overfencing

Posted on 2009-04-23 12:58 superman 阅读(175) 评论(0)  编辑 收藏 引用 所属分类: USACO
  1 #include <queue>
  2 #include <iostream>
  3 
  4 using namespace std;
  5 
  6 struct Point
  7 {
  8     int x, y;
  9 }   ;
 10 
 11 int n, m, ans;
 12 int rec[100 * 2 + 1][38 * 2 + 1];
 13 char map[100 * 2 + 1][38 * 2 + 1];
 14 
 15 bool inside(int i, int j)
 16 {
 17     return i >= 1 && i < n - 1 && j >= 1 && j < m - 1;
 18 }
 19 
 20 void bfs(Point & cp)
 21 {
 22     rec[cp.x][cp.y] = 1;
 23 
 24     queue <Point> q;
 25     q.push(cp);
 26 
 27     while (q.empty() == false)
 28     {
 29         Point cp = q.front(); q.pop();
 30 
 31         if (inside(cp.x - 1, cp.y) && map[cp.x - 1][cp.y] == ' ')
 32             if (rec[cp.x][cp.y] + 1 < rec[cp.x - 1][cp.y])
 33             {
 34                 rec[cp.x - 1][cp.y] = rec[cp.x][cp.y] + 1;
 35                 Point np = { cp.x - 1, cp.y };
 36                 q.push(np);
 37             }
 38         if (inside(cp.x + 1, cp.y) && map[cp.x + 1][cp.y] == ' ')
 39             if (rec[cp.x][cp.y] + 1 < rec[cp.x + 1][cp.y])
 40             {
 41                 rec[cp.x + 1][cp.y] = rec[cp.x][cp.y] + 1;
 42                 Point np = { cp.x + 1, cp.y };
 43                 q.push(np);
 44             }
 45         if (inside(cp.x, cp.y - 1&& map[cp.x][cp.y - 1== ' ')
 46             if (rec[cp.x][cp.y] + 1 < rec[cp.x][cp.y - 1])
 47             {
 48                 rec[cp.x][cp.y - 1= rec[cp.x][cp.y] + 1;
 49                 Point np = { cp.x, cp.y - 1 };
 50                 q.push(np);
 51             }
 52         if (inside(cp.x, cp.y + 1&& map[cp.x][cp.y + 1== ' ')
 53             if (rec[cp.x][cp.y] + 1 < rec[cp.x][cp.y + 1])
 54             {
 55                 rec[cp.x][cp.y + 1= rec[cp.x][cp.y] + 1;
 56                 Point np = { cp.x, cp.y + 1 };
 57                 q.push(np);
 58             }
 59     }
 60 }
 61 
 62 int main()
 63 {
 64     freopen("maze1.in""r", stdin);
 65     freopen("maze1.out""w", stdout);
 66 
 67     cin >> m >> n;
 68 
 69     n = 2 * n + 1;
 70     m = 2 * m + 1;
 71 
 72     cin.get();
 73     for (int i = 0; i < n; i++)
 74     {
 75         for (int j = 0; j < m; j++)
 76             map[i][j] = cin.get();
 77         cin.get();
 78     }
 79 
 80     for (int i = 0; i < n; i++)
 81     for (int j = 0; j < m; j++)
 82         rec[i][j] = INT_MAX;
 83 
 84     for (int i = 0, j = 0; j < m; j++)
 85         if (map[i][j] == ' ')
 86         {
 87             Point p = { i, j };
 88             bfs(p);
 89         }
 90     for (int i = 0, j = 0; i < n; i++)
 91         if (map[i][j] == ' ')
 92         {
 93             Point p = { i, j };
 94             bfs(p);
 95         }
 96     for (int i = n - 1, j = 0; j < m; j++)
 97         if (map[i][j] == ' ')
 98         {
 99             Point p = { i, j };
100             bfs(p);
101         }
102     for (int i = 0, j = m - 1; i < n; i++)
103         if (map[i][j] == ' ')
104         {
105             Point p = { i, j };
106             bfs(p);
107         }
108 
109     for (int i = 0; i < n; i++)
110     for (int j = 0; j < m; j++)
111         if (rec[i][j] != INT_MAX)
112             ans >?= rec[i][j];
113 
114     cout << ans / 2 << endl;
115 
116     return 0;
117 }
118 

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理