hihoCoder 1392 War Chess 大模拟

ACM/ICPC 2016 北京网络赛赛题 War Chess

题意

HDU上有一道类似题目链接HDU
以游戏曹操传为背景,给定地图N × M的矩阵。Gi j表示任人物穿过这个方格的行动值减小量。每个人物有以下属性:

  • 生命值 HP
  • 攻击力 AT
  • 行动力 MV
  • 攻击范围 [AD1, AD2]
  • 起始坐标 (STx, STy)
  • 所在阵营 GR

每个人物可以攻击攻击范围内的敌对玩家,一旦人物的HP小于等于0,将它的移出棋盘。人物可以从当前格子开始向四周移动,在人物移动过程中,当人物从格子(i,j)移到格子(x,y)时,他的行动力减少Gx y。当移动力小于0时移动是非法的。同时,当该人物四周有敌对人物时,该人物移动力变为0。
现在给定游戏记录,要求模拟游戏,并判断合法性。

思路

需要注意自己局中不能移动他人的棋子,死亡人物不能进行操作。
我的不能使用的代码
修改后的代码
有几点做的不好:

  1. 可以开一个数组记录每个格子被谁占领,注意走和被Drive out后要及时更新
  2. Attack前先要检测Attack之后HP是不是会小于等于0,如果是的就不能Attack
  3. 其实选择人物的时候并不需要检查Round
  4. 中间我还犯了一些错误,比如OC[dx][dy]写成了OC[x][y],没有设vis[STx][STy]。此外的move时的bfs里面,不能更新Cha[cha].MV,这是一个固有的值,每次走完MV是不变的,所以应当记录走完之后MV用了多少。
  5. 比赛的时候用的dfs,这样太慢了,实际上是bfs,用一个优先队列维护mv最大的状态,每次都是贪心从mv最大的状态走。