#P825. 毛毛游戏
毛毛游戏
问题描述
“毛毛”是一款在智能手机和电脑上流行的休闲游戏,自从在winsty的手机上初次体验后,dd_engi就非常喜欢它。
尽管存在丰富的变种玩法,但毛毛游戏的基本规则非常简单。在N行M列的矩阵中,每个位置有一个彩色的毛球。玩家可以拖动某一行或某一列的毛球,使这些毛球作为一个整体,以循环移动的方式改变位置。在循环移动中,该行或该列中被移出矩阵外的毛球,会依次填补到另一端被移走的毛球留下的空位中。例如,将某行的毛球向右拖动两格,则最右边的两个毛球会占据该行最左边的两个位置;同时,该行其余毛球右移两格。若移动后,单一颜色的毛球连通块包含的毛球个数达到或超过了三个,则这个连通块会被消除掉,同时新的毛球填补进来,玩家获得加分。在这里,我们定义毛球与它上、下、左、右的毛球(如果存在的话)为连通,例如,左上角的毛球与它右边和下边的毛球连通。事实上,在一般的毛毛游戏的规则中,只有会造成消除连通块以及获得加分的移动,才是合法的移动。
随着游戏难度的加大,dd_engi发现自己越来越难以找到合法的移动,请你编写一个程序来帮他找出所有合法移动的数目吧!值得注意的是,dd_engi认为,完全等价的移动方式只应被计数一次。例如,在含有五个毛球的一行中,循环右移一位和循环左移四位的两种移动就不应被重复计数。这里“完全等价”的确切定义是指,不管该行或该列毛球的颜色为何,两种移动的结果都一定相同。若两种移动方式不符合这里“完全等价”的定义,就应该被分别计数。
输入格式
第一行,空格隔开的两个整数M与N。
第二行开始的N行,每行M个正整数,表示矩阵中不同毛球的颜色。相同的整数代表相同的颜色,不同的整数代表不同的颜色。
初始的棋盘中不含包含毛球个数超过三个的单一颜色的毛球连通块。
输出格式
只需输出一个整数,表示合法移动方式的数目。
样例输入
3 3
1 2 3
2 1 3
1 3 2
样例输出
6
数据范围
1 <= N, M <=84
其余数字不超过三十二位整数范围。