UVa 11581

来源:互联网 发布:知乎 东风 编辑:程序博客网 时间:2024/06/03 16:53

题目:有一个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;}


原创粉丝点击