1.没有完全找清目标;
2.装上诸葛连弩后,没有发现前面的杀也能用;
那么继续,向30分发起冲击。
30分的要求是——有锦囊牌,但是没有无懈可击。好吧,我得承认,没有无懈可击也要写很久。
首先,决斗。还是要找清目标——反贼决斗目标一定是主公,忠臣决斗目标一定是表明身份的反贼,主公决斗目标是表明身份的反贼或类反贼。
然后是万箭齐发和南蛮入侵。这是个多重目标攻击,所以要对每一个存活的非攻击发起者发起一次单向进攻。
这个部分需要注意很多:
3.决斗时,进攻发起者可以要使用多张杀,所以要处理好决斗后,手牌剩余部分;
4.决斗时,可能进攻发起者会GG(不知道他怎么想的,不愧是pig),此时要停止他的回合;
5.万箭齐发(南蛮入侵)时,可能会有多人GG,可能会摸多次牌;
6.万箭齐发(南蛮入侵)时,可能会有多人GG,同时发动者是主公,不仅杀死了忠臣,也杀死了反贼,此时也要考虑弃掉所有手牌和摸三张牌的顺序;
7.决斗时,主公认为对面是类反贼,实际上是忠臣,忠臣要牺牲一滴血;
8.在决斗时,发起者会明确身份;在万箭齐发(南蛮入侵)时,可能并不会,但有可能成为类反贼;
30分的段也WA个不停,但总算还是达到了。
剩下就是无懈可击了。
这是一个难点,但我认为,要突破它,首先要搞清无懈在不同情况下了作用,还有——它一定在锦囊牌生效之前使用。
题目中定义,如果某人使用了一张锦囊牌,那么从他后面的猪开始,依次有出无懈的机会(当然对于一张锦囊牌,最多只有1张无懈针对他本身)。
那么,假如A对B出了一张锦囊牌,首先,需要保证B的身份已经亮明(否则没有人会帮他,包括他自己)
然后,和B一派的,一定想方设法使初始锦囊牌无效;和B不一派的,一定想方设法使初始锦囊牌生效。
那么,这可以写个简易的dfs(顺便在过程中,如果能且有必要出无懈,就直接出掉了)。
然后,无懈不可能当做第一张锦囊牌打出(相当于永远是后手)。
对于无懈而言,需要注意的地方:
9.无懈不可能先手打出,并不代表在自己回合内就不用出无懈;
10.无懈的优先级很高(比一般锦囊牌都高);
11.当一个人使用了无懈,他的身份就完全表明了;
12.无懈看似是最复杂,但是实际上相当于一个补丁(尽管有挺多的细节);
以上是大致的做法,从10pts->30pts->100pts,而实际上,我爆出了形形色色的部分分(等下会展示)
下面还有一些全局的注意点:
13.主公杀死忠臣,一定要把装备给弃了;
14.关于一轮能否出多次杀,要注意判断;
15.一张牌,你出了,就相当于弃置了,不管最后是否生效;
16.最形象的方法存手牌显然是链表,但考虑到实际需要,一般直接开数组;
17.要分清在自己的回合出牌和在别人的回合出牌,最好用不同方法处理,但处理也有很多细节(因人而异);
18.注意主公也会对类反贼表敌意;
19.杀,桃,无懈都是有可能在自己回合打出的“响应牌”(就是回击别人的牌),要注意处理方法(要看清是自己回合还是他人回合出的牌);
20.严格意义上,除了“桃”,在自己回合出了每一张牌后,可能会激活这张牌前面的牌;
21.注意这里的距离是单向的,而不是双向的,而且恒为1;
22.存在用无懈无懈掉自己的锦囊牌的情况;
23.阵亡的人已经没有任何价值,直接跳过他;
24.一旦出现胜利局面,就要停止一切操作,但是需要把没有整理好的手牌整理好;
25.对于一个人,要是把手牌扫了一遍,没有出任何牌,就结束出牌;
26.一个人死了后,即使更新上一个玩家的下一个玩家nxt(不必o1求);
27.注意一个人处于濒死状态的处理,没当有一个人死了,都要判断一下游戏是否结束了;
28.题目有一个小bug,当牌堆没有牌时,要一直摸最后一张牌。
这是我认为这题存在的细节(可能还有我数不过来了),这些细节有些是比较重要的,有些是要看写法的。
对于这一题我也有一些自己的看法——
这题其实很好,大量的代码,条件和情况能锻炼一个人的代码水平和思维能力。尽管有些方面不是特别好(比如出在了省选里面,估计没有什么人能打完并AC)。
然后我发现在luogu里面,这题的分类有一个AOE。为什么标AOE?有些人说因为南蛮和万箭是群体攻击。
我并不是这样认为的(当然也有可能我理解错了)——
因为这个题目依赖于主公亮明了身份。这个条件不是必要的,而是极其必要的。
因为,除主公外任意一个人要表明身份,必须要攻击一个以表明身份的人,这就构成了一个DAG(其实也是一颗树)。
tql