2020-12-17 链环转换
2020-12-08 思考题
题目并不是很难,但是由于我过于SB,对题面理解有误,想了老半天都想不出来,看了题解还觉得不对,但是实际上题解很真理。总之我就一SB。
题目简述
给出一个大小为 N × N N\times N N×N 的棋盘,以及棋盘的初始状态,要求反转不超过 ⌊ k 3 ⌋ \left\lfloor\frac{k}{3}\right\rfloor ⌊3k⌋ 个棋子( k k k 为棋子的总个数),使得修改后的棋盘符合“非终止”定义。输出一种符合要求的修改方案,如果有多种合法方案,任意输出一种方案即可。
我们用 A i , j ( 1 ≤ i , j ≤ N ) A_{i,j}\space(1\leq i, j\leq N) Ai,j (1≤i,j≤N) 表示中第 i i i 行、第 j j j 列的状态:
- A i , j = ’.’ A_{i, j}=\text{'.'} Ai,j=’.’ 表示该位置没有棋子,没有棋子的位置不允许进行状态反转的操作。
- A i , j = ’X’ A_{i, j}=\text{'X'} Ai,j=’X’ 表示该位置有棋子,棋子类型为 ’X’ \text{'X'} ’X’,反转后棋子类型为 ’O’ \text{'O'} ’O’。
- A i , j = ’O’ A_{i, j}=\text{'O'} Ai,j=’O’ 表示该位置有棋子,棋子类型为 ’O’ \text{'O'} ’O’,反转后棋子类型为 ’X’ \text{'X'} ’X’。
终止的定义是,棋盘上存在同种棋子的 “横三连” 或者 “竖三联”,形式化的表述为:
∃ i , j ∈ N , 1 ≤ i , j ≤ N \exist i,j \in \N,1\leq i, j\leq N ∃i,j∈N,1≤i,j≤N 使得 A i , j = A i + 1 , j = A i + 2 , j ≠ ’.’ A_{i, j}=A_{i+1, j}=A_{i+2, j}\not=\text{'.'} Ai,j=Ai+1,j=Ai+2,j=’.’ 或者 A i , j = A i , j + 1 = A i , j + 2 ≠ ’.’ A_{i, j}=A_{i, j+1}=A_{i, j+2}\not = \text{'.'} Ai,j=Ai,j+1=Ai,j+2=’.’。
如果一种棋盘状态不满足终止的定义,那么我们就称它 非终止。
有解性证明
接下来的内容中,我们将要证明:至少存在一种反转次数不超过 ⌊ k 3 ⌋ \left\lfloor\frac{k}{3}\right\rfloor ⌊3k⌋ 个棋子的方案,使得操作后的棋盘状态非终止。
定义:对棋盘上的每一个位置分类
我们在棋盘的每一个格子上写一个数字,我们第 i i i 行 第 j j j 列的格子上,我们写上数字 ( i + j ) m o d 3 (i+j) \mod 3 (i+j)mod3。此后,被写了相同数字的格子被划分到同一类中,这样我们就得到三类格子。
第一类格子的坐标的集合为
S
0
=
{
(
i
,
j
)
:
i
,
j
∈
N
,
1
≤
i
,
j
≤
N
且
(
i
+
j
)
m
o
d
3
=
0
}
S_0 = \{(i, j): i, j \in \N, 1\leq i, j\leq N 且 (i+j)\mod 3 = 0\}
S0={(i,j):i,j∈N,1≤i,j≤N且(i+j)mod3=0}。
第二类格子的坐标的集合为
S
1
=
{
(
i
,
j
)
:
i
,
j
∈
N
,
1
≤
i
,
j
≤
N
且
(
i
+
j
)
m
o
d
3
=
1
}
S_1 = \{(i, j): i, j \in \N, 1\leq i, j\leq N 且 (i+j)\mod 3 = 1\}
S1={(i,j):i,j∈N,1≤i,j≤N且(i+j)mod3=1}。
第三类格子的坐标的集合为
S
2
=
{
(
i
,
j
)
:
i
,
j
∈
N
,
1
≤
i
,
j
≤
N
且
(
i
+
j
)
m
o
d
3
=
2
}
S_2 = \{(i, j): i, j \in \N, 1\leq i, j\leq N 且 (i+j)\mod 3 = 2\}
S2={(i,j):i,j∈N,1≤i,j≤N且(i+j)mod3=2}。
为了表述方便,如果 ( i , j ) ∈ S x (i, j)\in S_x (i,j)∈Sx,我们称位置 ( i , j ) (i, j) (i,j) 隶属于分类 S x S_x Sx,称 ( i , j ) (i, j) (i,j)的类编号为 x x x(其中 x = ( i + j ) m o d 3 x=(i+j)\mod 3 x=(i+j)mod3)。
对 5 × 5 5\times 5 5×5 的棋盘,类型划分如下:
+--+--+--+--+--+
| 2| 0| 1| 2| 0|
+--+--+--+--+--+
| 0| 1| 2| 0| 1|
+--+--+--+--+--+
| 1| 2| 0| 1| 2|
+--+--+--+--+--+
| 2| 0| 1| 2| 0|
+--+--+--+--+--+
| 0| 1| 2| 0| 1|
+--+--+--+--+--+
引理:“一类定全局”
不难说明,若 ∃ x ∈ { 0 , 1 , 2 } \exist x \in \{0, 1, 2\} ∃x∈{0,1,2} 使得 ∀ ( i , j ) ∈ S x \forall (i,j)\in S_x ∀(i,j)∈Sx 有 A i , j ̸ = ′ X ′ A_{i, j}\not ='X' Ai,j=′X′,则棋盘上棋子 ’X’ \text{'X'} ’X’既不存在“横三连”,也不存在“竖三联”,形式化表述为:
∀ i , j ∈ { 1 , 2 , ⋯ , n } , A i , j = ’X’ , A i , j + 1 = ’X’ , A i , j + 2 = ’X’ \forall i, j\in \{1,2,\cdots,n\}, A_{i, j}=\text{'X'}, A_{i, j+1}=\text{'X'},A_{i, j+2}=\text{'X'} ∀i,j∈{1,2,⋯,n},Ai,j=’X’,Ai,j+1=’X’,Ai,j+2=’X’ 不可能同时成立。
∀ i , j ∈ { 1 , 2 , ⋯ , n } , A i , j = ’X’ , A i + 1 , j = ’X’ , A i + 2 , j = ’X’ \forall i, j\in \{1,2,\cdots,n\}, A_{i, j}=\text{'X'}, A_{i+1, j}=\text{'X'},A_{i+2, j}=\text{'X'} ∀i,j∈{1,2,⋯,n},Ai,j=’X’,Ai+1,j=’X’,Ai+2,j=’X’ 也不可能同时成立。
这一点很好证明,无论如何选取 x x x,任意横相连或者竖相连的三个位置上,都至少有一个隶属于分类 S x S_x Sx,因为任意横相连或者竖相连相邻的三个位置,他们的的类编号为 { ( i + j ) m o d 3 , ( i + j + 1 ) m o d 3 , ( i + j + 2 ) m o d 3 } \{(i+j)\mod 3, (i+j+1)\mod 3, (i+j+2) \mod 3\} {(i+j)mod3,(i+j+1)mod3,(i+j+2)mod3} 恰好取遍 0 , 1 , 2 {0, 1, 2} 0,1,2 三个值。
算法:“取两类格子各自清除一种棋子”
为了表述方便,我们定义了一个函数 C C C 用来统计某种分类的所有格子中,某种棋子的出现次数:
C ( v , ’X’ ) = ∑ ( i , j ) ∈ S v [ A i , j = ’X’ ] C(v, \text{'X'})=\sum_{(i, j)\in S_v} [A_{i, j}=\text{'X'}] C(v,’X’)=(i,j)∈Sv∑[Ai,j=’X’]
C ( v , ’O’ ) = ∑ ( i , j ) ∈ S v [ A i , j = ’O’ ] C(v, \text{'O'})=\sum_{(i, j)\in S_v} [A_{i, j}=\text{'O'}] C(v,’O’)=(i,j)∈Sv∑[Ai,j=’O’]
由于 S 0 ∪ S 1 ∪ S 2 S_0 \cup S_1 \cup S_2 S0∪S1∪S2 恰好覆盖整个棋盘,因此:
∑ v = 0 2 ( C ( v , ’X’ ) + C ( v , ’O’ ) ) = k \sum_{v = 0}^2(C(v, \text{'X'})+C(v, \text{'O'}))=k v=0∑2(C(v,’X’)+C(v,’O’))=k
根据引理“一类定全局”,我们可以给出一种能够使棋盘成为“非终止状态”的操作方案。
- 选择一对整数 ( p , q ) (p, q) (p,q) 其中 p , q ∈ { 0 , 1 , 2 } p,q \in \{0, 1, 2\} p,q∈{0,1,2} 且 p ≠ q p\not = q p=q。
- 然后将位置集合 S p S_p Sp 中所有的 ’X’ \text{'X'} ’X’ 反转。此次操作后,棋盘上一定不存在三连 ’X’ \text{'X'} ’X’。
- 最后将位置集合 S q S_q Sq 中所有的 ’O’ \text{'O'} ’O’ 反转。此次操作后,棋盘上一定不存在三连 ’O’ \text{'O'} ’O’。
经历了这样的操作后,我们得到的棋盘状态一定是非终止状态。
那么我们到底反转了多少个位置呢?是否能够证明,我们一定能找到一对 ( p , q ) (p,q) (p,q) 使得我们反转的位置的总数小于等于 ⌊ k 3 ⌋ \left\lfloor\frac{k}{3}\right\rfloor ⌊3k⌋ 呢?
为了方便表述,我们再定义一个函数 S ( x , y ) S(x, y) S(x,y):
S ( x , y ) = C ( x , ’X’ ) + C ( y , ’O’ ) S(x, y) = C(x, \text{'X'}) + C(y, \text{'O'}) S(x,y)=C(x,’X’)+C(y,’O’)
不难发现,当 x ≠ y x\not = y x=y 时, S ( x , y ) S(x, y) S(x,y) 就是 p = x , q = y p=x, q=y p=x,q=y 时上述算法反转的格子的总数。
另外有:
S ( 0 , 0 ) + S ( 1 , 1 ) + S ( 2 , 2 ) = ∑ v = 0 2 ( C ( v , ’X’ ) + C ( v , ’O’ ) ) = k S(0, 0) + S(1, 1) + S(2, 2)=\sum_{v = 0}^2(C(v, \text{'X'})+C(v, \text{'O'}))=k S(0,0)+S(1,1)+S(2,2)=v=0∑2(C(v,’X’)+C(v,’O’))=k
那么三分之一是怎么来的呢?
∑ i = 0 2 ∑ j = 0 2 S ( i , j ) = 3 × ∑ v = 0 2 ( C ( v , ’X’ ) + C ( v , ’O’ ) ) = 3 k \sum_{i=0}^2\sum_{j=0}^2S(i, j)=3 \times \sum_{v=0}^2(C(v, \text{'X'})+C(v, \text{'O'}))=3k i=0∑2j=0∑2S(i,j)=3×v=0∑2(C(v,’X’)+C(v,’O’))=3k
我们给出的算法总共只有六种方案,考虑将这些方案的操作次数求总和。
S ( 0 , 1 ) + S ( 0 , 2 ) + S ( 1 , 0 ) + S ( 1 , 2 ) + S ( 2 , 0 ) + S ( 2 , 1 ) = ( ∑ i = 0 2 ∑ j = 0 2 S ( i , j ) ) − ( ∑ i = 0 2 S ( i , i ) ) = 3 k − k = 2 k S(0, 1)+S(0, 2) + S(1, 0) + S(1, 2) + S(2, 0) + S(2, 1)=\left(\sum_{i=0}^2\sum_{j=0}^2S(i, j)\right)-\left(\sum_{i = 0}^2S(i, i)\right) = 3k-k=2k S(0,1)+S(0,2)+S(1,0)+S(1,2)+S(2,0)+S(2,1)=(i=0∑2j=0∑2S(i,j))−(i=0∑2S(i,i))=3k−k=2k
根据抽屉原理(6个数中的最小值一定小于等于这六个数的平均数),有:
min { S ( 0 , 1 ) , S ( 0 , 2 ) , S ( 1 , 0 ) , S ( 1 , 2 ) , S ( 2 , 0 ) , S ( 2 , 1 ) } ≤ S ( 0 , 1 ) + S ( 0 , 2 ) + S ( 1 , 0 ) + S ( 1 , 2 ) + S ( 2 , 0 ) + S ( 2 , 1 ) 6 = 2 k 6 = k 3 \min\{S(0, 1) , S(0, 2) , S(1, 0) , S(1, 2) , S(2, 0) , S(2, 1)\}\leq \frac{S(0, 1)+S(0, 2) + S(1, 0) + S(1, 2) + S(2, 0) + S(2, 1)}{6} = \frac{2k}{6}=\frac{k}{3} min{S(0,1),S(0,2),S(1,0),S(1,2),S(2,0),S(2,1)}≤6S(0,1)+S(0,2)+S(1,0)+S(1,2)+S(2,0)+S(2,1)=62k=3k
也就是说,我们找到六种方案中,反转次数最少的方案反转,其反转次数一定小于等于 k 3 \frac{k}{3} 3k。而反转次数一定是整数,因此反转次数一定 ≤ ⌊ k 3 ⌋ \leq \left\lfloor\frac{k}{3}\right\rfloor ≤⌊3k⌋。
Q . E . D . Q.E.D. Q.E.D.
与上面这道题相似
HJQ 大佬还教了我一到关于扫雷的题目,