问题 4476 --三国志曹操传

4476: 三国志曹操传

时间限制: 1 Sec  内存限制: 256 MB
提交: 0  解决: 0
[提交][状态][讨论版][命题人:]

题目描述

      三国志曹操传是一款棋盘式游戏。游戏以曹操为主角,四处征战,从讨伐黄巾军,到讨伐吕布,再到赤壁之战。每一场战役中,游戏者以指挥者的身份控制曹军将士的行动。游戏以回合制进行,每个回合曹军首先行动,曹军每个士兵按照命令依次行动,等所有士兵行动完毕后,接着敌军行动。        在战役打响之前,我们就已经预备好了一系列的命令,准备指挥士兵的行动。但是我们想在游戏进行之前就知道,若按照这些命令执行所有士兵最终的伤亡情况。所以希望你能帮助我们解决这个问题。 棋盘       游戏开始时,曹军和敌军都在一个N×N的棋盘上,棋盘被划分N×N个格子。棋盘左上角坐标为(1,1),右下角为(N,N)。曹军和敌军各有一些士兵,每个格子最多可以被一个士兵占据。为了简化,假设棋盘所有的格子都是平地,且士兵的移动不受其他士兵的阻挡。 士兵属性和攻击       每个士兵i有四个属性,Mi, Ai, Di, Hi 分别表示移动能力,攻击力,防御力和生命值。移动能力表示士兵每次最多可以移动Mi个格子。例如图1,士兵在绿色点,它的移动能力为2,当然,他也可以停留在原地。攻击力和防御力用来衡量一次攻击造成的伤害。当士兵i攻击士兵j,若Ai>Dj,那么Hj损失值=Ai-Dj;若Ai<=Dj,那么Hj损失1。当士兵的生命值<=0时,该士兵败阵,他占用的格子被释放。
命令描述       每个士兵一个回合只能行动一次。每次的行动可以用四个整数描述s x y d ,表示编号为s的士兵,移动到相对自己x,y坐标的格子上,并且攻击d方向的士兵。其中,s为士兵编号,将在输入格式中说明;x y为相对与当前坐标的位置,若该士兵当前在x0,y0,移动x,y,那么新坐标将是(x0+x,y0+y),若x=y=0则表示留在原地;方向d用1,2,3,4分别表示上、下、左、右四个方向,当d=0表示没有攻击行为。若完成命令,该士兵行动完毕,该回合不再接受其他命令。 兵种       战场上的士兵分为两种,一种是骑兵,一种是弓兵。骑兵和弓兵区别在攻击范围上。骑兵只能攻击相邻四个格子的敌人;而弓兵只能攻击隔一个格子的敌人(如图所示)。例如,若骑兵在(x0,y0)位置,攻击d=3方向(左)的敌人,则被攻击的坐标应该为(x0,y0-1);若弓兵在(x0,y0)位置,攻击d=2方向(下)的敌人,则被攻击的坐标为(x0+2,y0)。
非法命令       但不幸的是,由于考虑欠佳,我们之前准备的命令可能出现不合法的情况。于是我们制定以下规则来避免不合法的情况:
  • 若编号s的士兵已经行动完毕或已败阵,则该命令取消。
  • 若移动x,y后超出棋盘范围,或超出自己的移动能力,或新坐标被占据,则该命令取消。
  • 若移动到某个格子后,攻击的是空地或是我军士兵,则保留移动,放弃攻击命令,且该士兵行动完毕。
      题目给出回合开始时,所有敌我士兵的位置和属性,接着给出若干条命令,指挥曹军行动。要求程序能给出在双方第一回合行动完毕时,所有士兵的伤亡情况。

输入

      输入数据包含多组测试数据。每组测试数据第一行包含一个正整数N(1<=N<=20),表示棋盘大小为N×N。N=0表示输入结束,该数据不作处理。第二行包含两个正整数n1 n2 (n1,n2<=N),表示曹军有n1个士兵,敌军有n2个士兵。       接下来的2×n1行描述了曹军士兵的状态和属性。前n1行,每行两个整数x y表示第i个士兵的坐标。双方士兵编号都从1开始。数据保证士兵位置合法。       后面的n1行,每行包含5个整数Mi Ai Di Hi和Ci,分别表示第i个士兵的初始坐标(x0,y0),移动能力Mi,攻击力Ai,防御力Di,生命值Hi和兵种Ci;当Ci=0表示为骑兵,当Ci=1表示弓兵。       同样地,接下来的2×n2行每行描述了敌军的士兵。       再接下来的一行包含2个正整数m1 m2(m1,m2<=100),表示曹军预备了m1条命令,敌军预备了m2条命令。接下来的m1行,每行包含四个整数,s x y d,表示曹军s号士兵移动到相对自己x,y的位置,并且攻击d方向的士兵。       同样地,接下来m2行描述了敌军地命令。       命令按照输入顺序执行。

输出

      每组测试数据输出两行。第一行输出所有曹军士兵的生命值,第二行输出所有敌军士兵的生命值。若士兵败阵,输出生命值为0。每行按照士兵编号升序输出。每个生命值之间用空格分割,行尾不能有多于的空格。       每两次战役数据之间用一个空行分割。

样例输入

3
1 1
2 3 
2 13 5 22 0
3 2 
2 4 6 20 1
1 1
1 0 -1 2
1 -1 -1 4
0

样例输出

22
13

来源

[提交][状态]