superman

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

Section 2.4 - Tamworth Two

Posted on 2009-04-23 10:54 superman 阅读(93) 评论(0)  编辑 收藏 引用 所属分类: USACO
  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 enum { N, E, S, W };
  6 
  7 struct Point
  8 {
  9     int x, y;
 10 
 11     const Point next(int dir)
 12     {
 13         Point nextP;
 14         switch (dir)
 15         {
 16             case N : nextP.x = x - 1, nextP.y = y; break;
 17             case E : nextP.x = x, nextP.y = y + 1break;
 18             case S : nextP.x = x + 1, nextP.y = y; break;
 19             case W : nextP.x = x, nextP.y = y - 1break;
 20         }
 21         return nextP;
 22     }
 23     bool operator == (const Point & p)
 24     {
 25         return x == p.x && y == p.y;
 26     }
 27 }   ;
 28 
 29 char map[10][10];
 30 
 31 bool inside(const Point & p)
 32 {
 33     return p.x >= 0 && p.x < 10 && p.y >= 0 && p.y < 10;
 34 }
 35 bool couldReach(const Point & p)
 36 {
 37     return map[p.x][p.y] == '.';
 38 }
 39 
 40 int main()
 41 {
 42     freopen("ttwo.in""r", stdin);
 43     freopen("ttwo.out""w", stdout);
 44 
 45     Point cowStartP, JohnStartP;
 46 
 47     for (int i = 0; i < 10; i++)
 48     for (int j = 0; j < 10; j++)
 49     {
 50         cin >> map[i][j];
 51 
 52         if (map[i][j] == 'C')
 53             cowStartP.x = i, cowStartP.y = j, map[i][j] = '.';
 54         if (map[i][j] == 'F')
 55             JohnStartP.x = i, JohnStartP.y = j, map[i][j] = '.';
 56     }
 57 
 58     int curTime = 0;
 59     int ReachTime[10][10][4][10][10][4];
 60 
 61     memset(ReachTime, 255sizeof(ReachTime));
 62 
 63     Point cowCurP = cowStartP, JohnCurP = JohnStartP;
 64     int cowCurDir = N, JohnCurDir = N;
 65 
 66     while (true)
 67     {
 68         if (cowCurP == JohnCurP)
 69         {
 70             cout << curTime << endl;
 71             return 0;
 72         }
 73 
 74         if (ReachTime[cowCurP.x][cowCurP.y][cowCurDir][JohnCurP.x][JohnCurP.y][JohnCurDir] != -1)
 75             break;
 76         else
 77             ReachTime[cowCurP.x][cowCurP.y][cowCurDir][JohnCurP.x][JohnCurP.y][JohnCurDir] = curTime;
 78 
 79         Point cowNextP, JohnNextP;
 80 
 81         cowNextP = cowCurP.next(cowCurDir);
 82         if (inside(cowNextP) && couldReach(cowNextP))
 83             cowCurP = cowNextP;
 84         else
 85             cowCurDir = (cowCurDir + 1% 4;
 86 
 87         JohnNextP = JohnCurP.next(JohnCurDir);
 88         if (inside(JohnNextP) && couldReach(JohnNextP))
 89             JohnCurP = JohnNextP;
 90         else
 91             JohnCurDir = (JohnCurDir + 1% 4;
 92 
 93         curTime++;
 94     }
 95 
 96     cout << 0 << endl;
 97 
 98     return 0;
 99 }
100 

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