算法题目:Arnold变换是一种常见的图像置乱技术,Arnold变换定义如下:(C++语言实现)

Arnold变换是一种常见的图像置乱技术,Arnold变换定义如下: //对任意NN矩阵(素有元素相同的矩阵除外)设i,j为矩阵元素的初始下标,经过Arnold变换后行下标为i’,j’,其满足下式:

i’=(i+j)mod N 

j’=(i+2j)mod N ,i,j:0,1,…N-1

Arnold变换具有周期性,即经过若干次变换回到最初状态,且周期T与N的大小有关。 对于任意N>2,Tn<=nn/2,请编写程序求出Tn。

输入说明:对输入的每一个N,给出N*N矩阵的Arnold变换的周期T

输入样本:

3

8

0

输出样本 :

4

6

分析

如果要将二维数组全部遍历,时间复杂度会过大。我能想到的就是用一个点来近似代替整个方阵的变换。由于i和j每次变换时都要对维数取余,那么每大一阶是会影响其还原周期的,所以利用动态规划思想选择(n-1,n-1)点作为标志点应该是可行的。这个想法没有进行严谨的数学推导不知道其正确性,但是目前可以跑出样例。

实现

#include<iostream>
#include<vector>

using namespace std;

int main() {
int n;
vector<int> v;
while (true)
{

int num = 0;//初始化周期
cin >> n;
if (n == 0)
{
break;
}
int key = n - 1;
int i = key;
int j = key;

while (true)//计算变换周期
{
int temp = i;
i = (i + j) % n;
j = (temp + j * 2) % n;
if (i == key && j == key) {
num++;
v.push_back(num);
break;
}
else
{
num++;
}
}
}
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << endl;
}
system("pause");
return 0;
}

 

posted @ 2021-03-09 14:25  InfinityandBeyond  阅读(540)  评论(0)    收藏  举报