poj 2317 SHAKE

//矩形矩阵加密,有三种方法,要模拟这三种方法 ,第一,第二种加密方法比较容易实现,第三种方法比较麻烦,有点类似于
//蛇形填数的方法一样,只要认真地模拟一次,也是很容易就出来了! 
#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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值