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。
现在给定游戏记录,要求模拟游戏,并判断合法性。
思路
需要注意自己局中不能移动他人的棋子,死亡人物不能进行操作。
我的不能使用的代码
修改后的代码
有几点做的不好:
- 可以开一个数组记录每个格子被谁占领,注意走和被Drive out后要及时更新
- Attack前先要检测Attack之后HP是不是会小于等于0,如果是的就不能Attack
- 其实选择人物的时候并不需要检查Round
- 中间我还犯了一些错误,比如OC[dx][dy]写成了OC[x][y],没有设vis[STx][STy]。此外的move时的bfs里面,不能更新Cha[cha].MV,这是一个固有的值,每次走完MV是不变的,所以应当记录走完之后MV用了多少。
- 比赛的时候用的dfs,这样太慢了,实际上是bfs,用一个优先队列维护mv最大的状态,每次都是贪心从mv最大的状态走。