//矩形矩阵加密,有三种方法,要模拟这三种方法 ,第一,第二种加密方法比较容易实现,第三种方法比较麻烦,有点类似于
//蛇形填数的方法一样,只要认真地模拟一次,也是很容易就出来了!
#include "iostream"
#include "string"
#include "cctype"
using namespace std;
char matrix[110][110];
void shake(char (*a)[110], int r, int l)//第一种加密方法的实现
{
int i, j, k;
char temp;
for (i = 0; i < r; i++)
{
if (i%2 == 0)
{
temp = a[0][i];
for (j = 1; j < l; j++)
a[j-1][i] = a[j][i];
a[l-1][i] = temp;
}
else
{
temp = a[l-1][i];
for (j = l-1; j > 0; j--)
a[j][i] = a[j-1][i];
a[0][i] = temp;
}
}
}
void rattle(char (*a)[110], int r, int l)//第二种加密方法的实现
{
int i, j, k;
char temp;
for (i = 0; i < r; i++)
{
if (i%2 == 0)
{
temp = a[i][l-1];
for (j = l-1; j > 0; j--)
a[i][j] = a[i][j-1];
a[i][0] = temp;
}
else
{
temp = a[i][0];
for (j = 1; j < l; j++)
a[i][j-1] = a[i][j];
a[i][l-1] = temp;
}
}
}
void roll(char (*a)[110], int r, int l)//第三种加密方法的实现,有点类似蛇形填数的方法一样,只是分顺时针填数和逆时针填数!
{
int i = 0, j, num, k = 0;
char temp;
num = r / 2;
for (i = 0, k = 0; k < num; i++, r--, l--, k++)
{
if (k%2==0)
{
j = i = k;
temp = a[i][j];
i++;
while (i < r)
{
a[i-1][j] = a[i][j];
i++;
}
i--;
j++;
while (j < l)
{
a[i][j-1] = a[i][j];
j++;
}
j--;
while (i > k)
{
a[i][j] = a[i-1][j];
i--;
}
while (j > k+1)
{
a[i][j] = a[i][j-1];
j--;
}
a[i][j] = temp;
}
else
{
j = i = k;
temp = a[i][j];
j++;
while (j < l)
{
a[i][j-1] = a[i][j];
j++;
}
j--;
i++;
while (i < r)
{
a[i-1][j] = a[i][j];
i++;
}
i--;
while (j > k)
{
a[i][j] = a[i][j-1];
j--;
}
while (i > k+1)
{
a[i][j] = a[i-1][j];
i--;
}
a[i][j] = temp;
}
}
}
int main()
{
int i, j, k, len1, len2, size;
string input1, input2;
while (cin >> input1)
{
cin.get();
getline(cin, input2);
len1 = input1.length();
len2 = input2.length();
//求出矩阵大小,注意00代表100!
size = (input1[0]-48)*10 + input1[1]-48;
if (size == 0)
size = 100;
for (i = len2, j = 0; i < size * size; i++, j++)//如果输入的字符达不到矩阵的大小,需要填充!
input2.push_back('A'+j%26);
k = 0;
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
{
matrix[i][j] = input2[k];
k++;
}
for (i = 2; i < len1; i++)
{
if (input1[i] == 'S')
{
shake(matrix, size, size);
}
else if (input1[i] == 'R')
{
rattle(matrix, size, size);
}
else if (input1[i] == 'L')
{
roll(matrix, size, size);
}
}
//矩阵的输出
char tmp;
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
tmp = toupper(matrix[i][j]);
cout << tmp;
}
}
cout << endl;
}
system("pause");
}
poj 2317 SHAKE
最新推荐文章于 2017-08-02 18:58:43 发布