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;}
阅读全文
0 0
- UVa 11581
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- ORACLE重建控制文件
- jQuery.extend扩展利器
- Tomcat 或者 Nginx 配置 Https
- VS2015套接字编程时error C4996错误处理
- Android layout系列-autolayout
- UVa 11581
- C#阶乘递归算法
- 毕业两年
- wait 、notify 、join、yield
- 探秘MATLAB求FFT,计算能量谱
- ES6入门--let的基本使用
- 匿名类&本地类&默认方法
- 深度解析卷积神经网络的实现细节
- C的单双引