简单BFS。注意最后一组数据,每个初始点不考虑周围是否有敌人。

  1 /* 3345 */
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <cstdlib>
  6 #include <queue>
  7 using namespace std;
  8
  9 #define MAXN 105
 10 #define INF  0xfffff
 11
 12 typedef struct node_t {
 13     int x, y, e;
 14     node_t() {}
 15     node_t(int xx, int yy, int ee) {
 16         x = xx; y = yy; e = ee;
 17     }
 18 } node_t;
 19
 20 char map[MAXN][MAXN];
 21 bool stop[MAXN][MAXN];
 22 int hp[MAXN][MAXN];
 23 int hurt[MAXN][MAXN];
 24 int n, m, mv;
 25 int bx, by;
 26 int dir[4][2] = {
 27     -1,0,0,-1,1,0,0,1
 28 };
 29
 30 void init() {
 31     int i, j, k;
 32
 33     memset(stop, false, sizeof(stop));
 34     memset(hurt, -1, sizeof(hurt));
 35     for (i=1; i<=n; ++i) {
 36         for (j=1; j<=m; ++j) {
 37             if (map[i][j] == 'E') {
 38                 stop[i-1][j] = stop[i][j-1] = stop[i+1][j] = stop[i][j+1] = true;
 39                 hurt[i][j] = INF;
 40             } else if (map[i][j] == 'Y') {
 41                 bx = i;
 42                 by = j;
 43             } else if (map[i][j] == '.') {
 44                 hurt[i][j] = 1;
 45             } else if (map[i][j] == 'T') {
 46                 hurt[i][j] = 2;
 47             } else if (map[i][j] == 'R') {
 48                 hurt[i][j] = 3;
 49             } else if (map[i][j] == 'P') {
 50                 hurt[i][j] = 1;
 51             } else if (map[i][j] == '#') {
 52                 hurt[i][j] = INF;
 53             }
 54         }
 55     }
 56 }
 57
 58 bool check(int x, int y) {
 59     return x<=0 || x>n || y<=0 || y>m;
 60 }
 61
 62 void bfs() {
 63     int x, y, e;
 64     int i, j, k;
 65     queue<node_t> Q;
 66     node_t nd;
 67
 68     memset(hp, -1, sizeof(hp));
 69     //if (stop[bx][by] == false)
 70         Q.push(node_t(bx,by,mv));
 71     hp[bx][by] = mv;
 72
 73     while (!Q.empty()) {
 74         nd = Q.front();
 75         Q.pop();
 76
 77         for (i=0; i<4; ++i) {
 78             x = nd.x + dir[i][0];
 79             y = nd.y + dir[i][1];
 80             if (check(x, y))
 81                 continue;
 82             e = nd.e - hurt[x][y];
 83             if (e > hp[x][y]) {
 84                 hp[x][y] = e;
 85                 if (stop[x][y] == false)
 86                     Q.push(node_t(x, y, e));
 87             }
 88         }
 89     }
 90 }
 91
 92 void merge() {
 93     int i, j, k;
 94
 95     for (i=1; i<=n; ++i) {
 96         for (j=1; j<=m; ++j) {
 97             if (hp[i][j]>=0 && map[i][j]!='P') {
 98                 map[i][j] = '*';
 99             }
100         }
101     }
102     map[bx][by] = 'Y';
103 }
104
105 int main() {
106     int t;
107     int i, j, k;
108
109     #ifndef ONLINE_JUDGE
110         freopen("data.in", "r", stdin);
111         freopen("data.out", "w", stdout);
112     #endif
113
114     scanf("%d", &t);
115     while (t--) {
116         scanf("%d %d %d", &n, &m, &mv);
117         for (i=1; i<=n; ++i)
118             scanf("%s", map[i]+1);
119         init();
120         bfs();
121         merge();
122         for (i=1; i<=n; ++i)
123             printf("%s\n", map[i]+1);
124         printf("\n");
125     }
126
127     return 0;
128 }

转载于:https://www.cnblogs.com/bombe1013/p/4284271.html

【HDOJ】3345 War Chess相关推荐

  1. 【HDOJ】4602 Partition

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...

  2. 【HDOJ】4602 Partition_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...

  3. 【HDOJ】1008 Elevator_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=1008 [报告] 这是我在HDOJ里看到的最水的题目,至少目前为止. 题目里已经讲得很清楚了,模拟就能过 ...

  4. 【HDOJ】1022 Train Problem I_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1022 [报告] 模拟,直接模拟一个栈的运行就行了. [程序] // Task: 1022 Train P ...

  5. 【HDOJ】1003 Max Sum_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1003 [报告] 既然是子区间加和问题,可以用减法来处理.比如求[5..10]的和,可以直接用[1..10 ...

  6. 【HDOJ】4768 Flyer_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4768 [报告] 题目中已经说了,保证最多出现一个奇数,所以可以用异或的想法.把所有的数异或起来,如果最后 ...

  7. 【HDOJ】4699 Editor_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [报告] 模拟题吧,本身不是很难. 最初的想法是用Splay tree写,然后疯掉了.苏牛说2B ...

  8. 【HDOJ】4704 Sum_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=4704 [报告] S(K)显然就是N的K正整数划分数.所以SUM{S(K),1<=K<=N} ...

  9. 【HDOJ】1015 Safecracker_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1015 [报告] 题目写的很长,忽略一系列废话,题意就是求一个方程v - w^2 + x^3 - y^4 ...

最新文章

  1. java工程webservice的应用案例
  2. 微信小程序去除左上角返回的按钮
  3. 第四代测序(纳米孔测序)有望全面代替边合成边测序吗?
  4. POJ1703带权并查集(距离或者异或)
  5. Java_斐波那契数列_兔子生兔子算法
  6. EventBus/EventQueue 再思考
  7. python导出csv有引号_python – csv中的双引号元素不能用pandas读取
  8. (33)FPGA面试技能提升篇(MIPI接口)
  9. python怎么启动服务器_如何在Python单元中从命令行启动服务器
  10. Axure原型模板CRM客户关系管理系统高保真原型设计
  11. Xxmm_Move_Order_Print
  12. 文献解读|基于转录组-蛋白质组数据联合分析对煎蛋水母毒性评价、毒素筛选及其干预
  13. python 蓝桥杯排序
  14. 【thm】windows内网提权之Windows PrivEsc
  15. 人工智能导论(数据挖掘)
  16. Qt 6.3.1 显示界面元素
  17. 洛谷 P2141 珠心算测验
  18. QTableWidget大数据文件显示(1000万行数据)
  19. python:ImportError: cannot import name ‘xx‘ from ‘xxxx‘
  20. 数据规整:连接、联合与重塑(数据分析)

热门文章

  1. Swift中的选项集合
  2. cesium加载百度地图_四大Webgis地图框架的对比选择
  3. python中set函数_python中的set函数、列表的操作
  4. Docker 的 Web 管理工具 DockerFly
  5. 基因组表达分析:如何选择RNA-seq vs. 芯片
  6. 使用组件构建Android应用程序
  7. EWORD 0511
  8. 解决html连续字符或数字换行的问题
  9. 内存溢出和内存泄漏的区别、产生原因以及解决方案
  10. 【MySQL】ERROR 1045 (28000): Access denied for user的解决方法