1753
题目简介:
翻转一个4*4的黑白棋矩阵使之全黑或全白,每次翻转会带动周围上下左右四个棋子进行翻转
方法:
状态压缩,广度搜索
解题思路:
-
状态压缩
该棋面上有16个棋子,每个棋子对应黑白两种状态,可以将其看作一个16位的二进制数,1代表白色,2代表黑色的状态,则这幅棋盘的所有状态均可用一个 1 − ( 2 16 − 1 ) 1-(2^{16}-1) 1−(216−1) 中间的一个数进行表示
-
翻转操作
2.1每次翻转该棋子及其周围上下左右的四个棋子,在而压缩过后,可以看作是原来棋盘对应的一个二进制数与一个固定的,至于编号相关的二进制数进行一次异或操作(^),即可得到新棋盘的状态
2.2我们可以预先求出每一个编号及其周围翻转过后的二进制状态备用。
部分代码
//处理16种翻转状态
int change(){
for(int i = 0; i<size;i++){
for(int j = 0; j<size;j++){
//(i*size+j)位该位置的编号
int value = 1<<(i*size+j);
for(int m = 0; m <dir_num;m++){
int next_x = i + dir_x[m];
int next_y = j + dir_y[m];
if(Judge(next_x,next_x)) value += 1<<(next_x*size+next_y);
}
pos[i*size+j] = value;
}
}
}
</