#P1414. Life Line
Life Line
题目描述
让我们来玩一个新的棋盘游戏“生命线”。
玩家数量大于1且小于10。
在这个游戏中,棋盘是一个由许多小正三角形排列而成的大正三角形(如图1所示)。每个小三角形的边长相同。
棋盘的大小由大三角形底边上的顶点数量表示。例如,图1中棋盘的大小为4。
游戏开始时,每位玩家被分配一个1到9之间的唯一识别号码,并获得一些写有自己号码的石头。
每位玩家轮流将自己的石头放在一个“空”顶点上。“空顶点”是指没有石头的顶点。
当一位玩家在自己的回合中将石头放在某个顶点时,可能会从棋盘上移除一些石头。玩家获得的分数等于他移除的自己的石头数量。玩家单回合的得分是他获得的分数减去他在该回合中失去的分数。
移除石头的条件如下:
- 棋盘上的石头被分成若干组。每组包含一组号码相同且相邻放置的石头。也就是说,如果相同号码的石头相邻放置,它们属于同一组。
- 如果一组石头中没有至少一个与“空”顶点相邻的石头,则该组所有石头将从棋盘上移除。
图2展示了石头分组的示例。
假设现在是玩家“4”的回合。如果他按照图3a所示将石头放在顶点上,将满足移除某些石头组的条件(图3b中阴影部分)。玩家获得6分,因为移除了6个其他玩家的石头(见图3c)。
再举一个例子,假设在图2中是玩家“2”的回合。如果玩家按照图4a所示将石头放在顶点上,将满足移除某些石头组的条件(图4b中阴影部分)。玩家获得4分,因为移除了4个其他玩家的石头。但同时,他失去了3分,因为移除了自己的3个石头。因此,玩家该回合的得分为4 - 3 = 1(见图4c)。
当每位玩家将所有石头放在棋盘上时,游戏结束。玩家的总得分是他所有回合得分的总和。
你的任务是编写一个程序,计算当前回合玩家可以获得的最大得分(即他获得的分数减去他失去的分数)。
输入格式
输入包含多组数据。每组数据表示游戏进行中的棋盘状态。每组数据的格式如下:
...
...
其中: • 是棋盘的大小()。
• 是当前回合玩家的识别号码()。即,你的程序需要计算他在该回合的得分。
• 是棋盘上顶点的状态()。如果 为正数,表示该顶点有一个编号为 的石头;如果 为0,表示该顶点是“空”的。
输入以两个0(即 )结束。
输出格式
对于每组数据,输出当前回合玩家可以获得的最大得分,每个结果占一行。
输入样例1
4 4
2
2 3
1 0 4
1 1 4 0
4 5
2
2 3
3 0 4
1 1 4 0
4 1
2
2 3
3 0 4
1 1 4 0
4 1
1
1 1
1 1 1
1 1 1 0
4 2
1
1 1
1 1 1
1 1 1 0
4 1
0
2 2
5 0 7
0 5 7 0
4 2
0
0 3
1 0 4
0 1 0 4
4 3
0
3 3
3 2 3
0 3 0 3
4 2
0
3 3
3 2 3
0 3 0 3
6 1
1
1 2
1 1 0
6 7 6 8
0 7 6 8 2
6 6 7 2 2 0
5 9
0
0 0
0 0 0
0 0 0 0
0 0 0 0 0
5 3
3
3 2
4 3 2
4 4 0 3
3 3 3 0 3
0 0
输出样例1
6
5
1
-10
8
-1
0
1
-1
5
0
5
来源
Japan 2002 Kanazawa