oj 1.8编程基础之多维数组 25:螺旋加密

写在前面的话:

我写的实际上是c语言,但是下面的那个代码的部分,我只能找到c++的按钮(或者说,我应该按c#吗?(ˇˍˇ) 想~),所以可能你复制过去会有一些小问题。

如果有人知道怎么解决的话,请告诉我!谢谢Thanks♪(・ω・)ノ

Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:

1. 所有文本只包含大写字母和空格。

2. 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。

按照下图所示的方式,将每个字符对应数值的5位二进制数依次填入矩阵。最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:

oj 1.8编程基础之多维数组 25:螺旋加密_第1张图片

将矩阵中的数字按行连起来形成数字串,完成加密。例子中的信息最终会被加密为:0000110100101100。

输入

一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。

输出

一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。

样例输入

4 4 ACM

样例输出

0000110100101100

#include
#include

void print(int arr[100][100],int r,int c)
{
    int i,j;
    for(i=0;i=0;j--)
        {
            printf("%d",b[j]);
        }
        printf("\n");


        for(j=4;j>=0;j--)
        {
            arr[pr][pc]=b[j];
            if(strcmp(direction,"right")==0)
            {
                pc++;
                if(pc>=c||arr[pr][pc]>=0)//这个arr的判断完美地解决了范围缩小的情况
                {
                    pc--;
                    pr++;
                   strcpy(direction,"down");

                }
            }
            /*
            这里的话,就是我们从arr[0][0]来看,开始是往右边走,等到最右边,也就是arr【0】【c-1】
            这个位置被赋值之后,direction还是right,所以他会进来在进行一次pc++(此时pc变成c),
            但是我们是要得到下一次的位置,所以我们首先要进行pc--(此时pc=c-1)然后就是向下(pr++)
            这样我们就得到了下一的位置



            */
           else if(strcmp(direction,"down")==0)//这里不要偷懒写错if
            {
                pr++;
                if(pr>=r||arr[pr][pc]>=0)
                {
                    pr--;
                    pc--;
                 strcpy(direction,"left");
                }
            }
          else  if(strcmp(direction,"left")==0)
            {
                pc--;
                if(pc<0||arr[pr][pc]>=0)
                {
                    pc++;
                    pr--;
                   strcpy(direction,"up");
                }
            }
          else  if(strcmp(direction,"up")==0)
            {
                pr--;
                if(pr<=0||arr[pr][pc]>=0)
                {
                    pr++;
                    pc++;
                    strcpy(direction,"right");

                }
            }

            printf("every time arr is \n");
            print(arr,r,c);//每一次运行的时候就去判断一下


        }
    }


        for(i=0;i

最后的代码

#include
#include


int main()
{
    int r,c;
    char str[100];
    scanf("%d %d",&r,&c);
    getchar();
    gets(str);

    //首先进行一个二进制的转换

    int i,j;

    int len=strlen(str);

    int arr[100][100];
    memset(arr,-1,sizeof(arr));//初始化为-1

    int pr=0,pc=0;
    char direction[10]="right";

    for(i=0;i=0;j--)
        {
            arr[pr][pc]=b[j];
            if(strcmp(direction,"right")==0)
            {
                pc++;
                if(pc>=c||arr[pr][pc]>=0)//这个arr的判断完美地解决了范围缩小的情况
                {
                    pc--;
                    pr++;
                   strcpy(direction,"down");

                }
            }

           else if(strcmp(direction,"down")==0)//这里不要偷懒写错if
            {
                pr++;
                if(pr>=r||arr[pr][pc]>=0)
                {
                    pr--;
                    pc--;
                 strcpy(direction,"left");
                }
            }
          else  if(strcmp(direction,"left")==0)
            {
                pc--;
                if(pc<0||arr[pr][pc]>=0)
                {
                    pc++;
                    pr--;
                   strcpy(direction,"up");
                }
            }
          else  if(strcmp(direction,"up")==0)
            {
                pr--;
                if(pr<=0||arr[pr][pc]>=0)
                {
                    pr++;
                    pc++;
                    strcpy(direction,"right");

                }
            }



        }
    }


        for(i=0;i

你可能感兴趣的:(算法,C语言,c++)