题目:有一个3x3的矩阵g,定义函数f(g)为每个元素相邻四个方向的1的个数%2
(奇数为1、偶数为2),定义递归函数f_k(g) = f(f_k-1(g)),计算循环节。
分析:数论,循环节。计算上界为2^9一定有重复的状态,存储中间结果判断即可。
说明:(⊙v⊙)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE (1<<9)
int record[MAX_SIZE];
int matrix[3][3], a[3][3], b[3][3];
int dxy[4][2] = {1,0, 0,1, -1,0, 0,-1};
void copy(int tar[][3], int src[][3])
{
for (int i = 0; i < 3; ++ i) {
for (int j = 0; j < 3; ++ j) {
tar[i][j] = src[i][j];
}
}
}
int matrix_to_value(int b[][3])
{
int ans = 0;
for (int i = 0; i < 3; ++ i) {
for (int j = 0; j < 3; ++ j) {
ans = ans*2 + b[i][j];
}
}
return ans;
}
void transform()
{
for (int i = 0; i < 3; ++ i) {
for (int j = 0; j < 3; ++ j) {
int x, y, sum = 0;
for (int k = 0; k < 4; ++ k) {
x = i + dxy[k][0];
y = j + dxy[k][1];
if (x >= 0 && x < 3 && y >= 0 && y < 3) {
sum += a[x][y];
}
}
b[i][j] = sum % 2;
}
}
}
int main()
{
int n, buf[3];
while (~scanf("%d",&n))
while (n --) {
for (int i = 0; i < 3; ++ i) {
scanf("%d",&buf[i]);
matrix[i][0] = buf[i]/100;
matrix[i][1] = buf[i]/10%10;
matrix[i][2] = buf[i]%10;
}
copy(a, matrix);
memset(record, 0, sizeof(record));
int value = matrix_to_value(matrix);
record[value] = 1;
int ans = -1;
for (; ans <= MAX_SIZE; ++ ans) {
transform();
value = matrix_to_value(b);
if (record[value]) {
break;
}else {
record[value] = 1;
}
copy(a, b);
}
printf("%d\n",ans);
}
return 0;
}