题目链接:
题目大意: 给一个矩阵,0表示空的可走,-1宝藏的位置(只有一个),其余的正整数表示该位置石头数。甲乙两个人,轮流玩游戏。甲先玩,谁先从外面通过空路径到达了宝藏的位置(不能经过石头),谁就获胜。如果不能直接到达宝藏位置,可以从外面通过空到某个位置,拿走该位置上的一个石头,如果该位置没有石头则变成空的可走。
解题思路:
不错的BFS。
首先如果甲能一步到达宝藏位置,则甲获胜。
否则,一定有一个环包围着宝藏,则甲肯定不能先捅破这个环,不然乙一步就赢了。所以它尽可能的拿掉环外的石头,同理对于乙来说,也是尽可能的拿掉外面的石头,不能把环打破。
所以只用统计外面石头总数以及环上每个位置留一个石头后的和即可。
如果是奇数,说明甲恰好把最后一个环外的石头拿掉,此时乙必破环。甲胜,否则乙胜。
bfs1() //从宝藏位置从内往外扫描,把该环标记。
bfs2() //从边框bfs,如果走到了边界 +(hp-1) 否则为外面的点 +(hp)
注意:
6 7 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 3 5 1 1 1 1 0 -1 4 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1
ans=16 不是22
这组测试数据 计数的时候是不包括3,5的,因为环已经包括了。(wa了一上午)不能直接统计空的,非空的也要标记,只不过不放到队列中而已,要换个姿势。
还有要注意这组测试数据:
7 7 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 -1 0 0 1 1 1 1 1 1 1 1
环内有有数。
代码:
#include #include #include #include #include #include #include #include #include