Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81050
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 14:00
个人简介

有梦想的人,正在努力

文章分类

全部博文(32)

文章存档

2015年(32)

我的朋友

分类: C/C++

2015-04-28 22:33:36

    题目的意思是给定一个起点、一个出口、还有一些墙。给定一个时间T,要求刚好在T秒的时候走到出口处。     刚开始我用的BFS,结果后来才发现把题看错了。仔细一看:给定一个时间T,要求刚好在T秒的时候走到出口处。  所以说广度搜索应该是不可行了,因为不是要求在T秒之内到达。

    之后改用DFS,超时。所以需要剪枝。剪掉一些不可能的情况,比如剩余的时间和剩余的步数奇偶性不同,则不可能到达,所以要剪掉。另外可以走的方块的数量(这里可以走的指的是除去墙以外的所有地方,包括起点)小于等于T ,也是不可能的,因为一个地方只能走一次。这里又可以剪掉。
AC代码如下:

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. char Map[8][8] = {{0}};
  5. int m, n, t, sx, sy, dx, dy, wall, escape;
  6. int dir[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };

  7. void dfs(int x, int y, int cur_t);

  8. int main()
  9. {
  10.     while(cin >> n >> m >> t)
  11.     {
  12.         wall = 0;
  13.         if(0 == n && 0 == m && 0 == t)
  14.             break;
  15.         for(int i = 1; i <= n; ++i)
  16.         {
  17.             for(int j = 1; j <= m; ++j)
  18.             {
  19.                 cin >> Map[i][j];
  20.                 if('S' == Map[i][j]) {sx = i; sy = j; Map[i][j] = 'X';} //将起点标记为墙,这里注意起点S不计入到wall变量中
  21.                 else if('D' == Map[i][j]) {dx = i; dy = j;}
  22.                 else if('X' == Map[i][j]) wall++; //计算墙的数量,不包括起点
  23.             }
  24.         }

  25.         if(n * m - wall <= t) //需要走t步, 如果可以走的地方少于等于t,则不可能到达
  26.         {
  27.             cout << "NO\n";
  28.             continue;
  29.         }
  30.         escape = 0;
  31.         dfs(sx, sy, 0);
  32.         if(escape)
  33.             cout << "YES\n";
  34.         else
  35.             cout << "NO\n";
  36.     }
  37. }

  38. void dfs(int x, int y, int cur_t)
  39. {
  40.     if(x <= 0 || x > n || y <= 0 || y > m)
  41.         return;
  42.     if(x == dx && y == dy && cur_t == t)
  43.     {
  44.         escape = 1;
  45.         return;
  46.     }
  47.     int p = t - cur_t - abs(dx - x) - abs(dy - y);   //p为奇数就是不可能的,画画图就知道为什么这样写了。
  48.     if(p < 0 || p&1) return;                //判断奇数可以直接将一个数与上1。
  49.     for(int i = 0; i < 4; ++i)
  50.     {
  51.         if('X' != Map[x + dir[i][0]][y + dir[i][1]])
  52.         {
  53.             Map[x + dir[i][0]][y + dir[i][1]] = 'X';
  54.             dfs(x + dir[i][0], y + dir[i][1], cur_t + 1);
  55.             if(escape) return;
  56.             Map[x + dir[i][0]][y + dir[i][1]] = '.';
  57.         }
  58.     }
  59.     return;
  60. }

阅读(710) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~