来自M78的光之文轩 2022-10-24 22:08 采纳率: 92%
浏览 33
已结题

OJ 1.8的第25题代码错误不知道怎么修改

OJ 1.8的第25题代码错误不知道怎么修改
题目在http://noi.openjudge.cn/ch0108/25/


#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
void A_er(char a,char s[100]){  //定义函数将大写字母转换成二进制,以字符串形式 
    int t=(a-'A'+1);
    s[0]='0'+t/16;
    t-=t/16*16;
    s[1]='0'+t/8;
    t-=t/8*8;
    s[2]='0'+t/4;
    t-=t/4*4;
    s[3]='0'+t/2;
    t-=t/2*2;
    s[4]='0'+t;
    for(int i=5;i<100;i++){    //将余下的位置用0填上 
        s[i]='0';
    }
}
int main(){
    int R,C;
    cin>>R>>C;
    char s[410]={0},b[600][100]={0};
    cin>>s;              //输入原字符串 
    int i,l=0,L,I=0;
    for(i=0;i<strlen(s);i++,l++){
        if(s[i]!=' ')  A_er(s[i],b[l]);           //将二进制分别填补到二维数组b中 
    }
    for(i=0;i<410;i++){
        s[i]='0';                 //再一次令s为0字符串 
    }
    for(i=0;i<l;i++){
        for(L=0;L<5;L++){
            s[I++]=b[i][L];    //把 b中的二进制填到s中 
        }
    }
    for(i=0;i<R;i++){
        for(L=0;L<C;L++){   //将 b中成员都变为0 
            b[i][L]='0';
        }
    }
    I=0,i=0,l=0;
    int t;
    if(R==1){
        for(i=0;i<C;i++){     //排除只有一行 
            cout<<s[i];
        }
        return 0;
    }
    else if(C==1){
        for(i=0;i<R;i++){    //排除只有一列 
            cout<<s[i];
        }
        return 0;
    }
    else if(min(C,R)%2==0){
        for(t=0;t<1.0/2.0*min(C,R);t++){   //偶数时,刚好螺旋min(C,R)/2次,结束 
            while(l<C-t){
                b[i][l++]=s[I++];
            }
            l--,i++;                     //l在结束多加了1,所以减掉1, i+1是为了使下次赋值从下行开始 
            while(i<R-t){
                b[i++][l]=s[I++];
            }
            i--,l--;
            while(l>=t){
                b[i][l--]=s[I++];
            }
            l++,i--;
            while(i>t){
                b[i--][l]=s[I++];
            }
            i++,l++;
        }
    }
    else{
        for(t=0;t<1.0/2.0*min(C,R);t++){   //奇数时,螺旋min(C,R)/2次后还要再补上一行或一列
            while(l<C-t){
                b[i][l++]=s[I++];
            }
            l--,i++;
            while(i<R-t){
                b[i++][l]=s[I++];
            }
            i--,l--;
            while(l>=t){
                b[i][l--]=s[I++];
            }
            l++,i--;
            while(i>t){
                b[i--][l]=s[I++];
            }
            i++,l++;
        }
        for(i=max(C,R)+1-2*(t+1);i>0;i--){  //在最后一圈结束后,还有max(C,R)+1-2*(t+1)个地方没有填上数据 
            if(C>R){
                b[i][l++]=s[I++];     //之前的循环结束后,最后一定停在了b[i][l]的位置 
            }
            if(C<=R){
                b[i++][l]=s[I++];
            }
        }
    }
    for(i=0;i<R;i++){          //最后输出b 
        for(l=0;l<C;l++){
            cout<<b[i][l];
        }
    }
    return 0; 
}
  • 写回答

2条回答 默认 最新

  • 关注

    有几个问题:
    (1)字符转二进制的时候,没有处理空格
    (2)读取数据的时候,用cin读取会丢失空格,题目要求包含大写字母和空格
    (3)处理螺旋的时候,逻辑有点问题,具体原因没找出来,但是有测试用例会不通过,我给你简化修改了一下。
    运行结果:

    img

    代码:

    #include<iostream>
    #include<string.h>
    #include<math.h>
    using namespace std;
    void A_er(char a,char s[100]){  //定义函数将大写字母转换成二进制,以字符串形式 
        if(a==' ')
        {
            for(int i=0;i<5;i++)
                s[i] = '0';
            return;
        }
    
    
        int t=(a-'A'+1);
        s[0]='0'+t/16;
        t-=t/16*16;
        s[1]='0'+t/8;
        t-=t/8*8;
        s[2]='0'+t/4;
        t-=t/4*4;
        s[3]='0'+t/2;
        t-=t/2*2;
        s[4]='0'+t;
        /*for(int i=5;i<100;i++){    //将余下的位置用0填上 
            s[i]='0';
        }*/
    }
    int main(){
        int len = 0;
        int R=0,C=0;
        char s[410]={0},b[600][30]={0};
        int i=0,l=0,L,I=0;
        while(1)
        {
            s[len] = getchar();
            if(s[len]=='\n' || s[len]==EOF)
            {
                s[len] = 0;
                break;
            }else
                len++;
        }
        i=0;
        while(s[i]!=' ')
        {
            R = R*10 + s[i]-'0';
            i++;
        }
        i++; //跳过空格
        while(s[i]!=' ')
        {
            C = C*10 + s[i]-'0';
            i++;
        }
        i++;//跳过空格
    
    
        for(;i<len;i++,l++){
            A_er(s[i],b[l]);           //将二进制分别填补到二维数组b中 
        }
        for(i=0;i<R*C;i++){
            s[i]='0';                 //再一次令s为0字符串 
        }
        for(i=0;i<l;i++){
            for(L=0;L<5;L++){
                s[I++]=b[i][L];    //把 b中的二进制填到s中 
            }
        }
    
        for(i=0;i<R;i++){
            for(L=0;L<C;L++){   //将 b中成员都变为0 
                b[i][L]='0';
            }
        }
        
        
        int t =0;
        if(R==1){
            for(i=0;i<C;i++){     //排除只有一行 
                cout<<s[i];
            }
            return 0;
        }
        else if(C==1){
            for(i=0;i<R;i++){    //排除只有一列 
                cout<<s[i];
            }
            return 0;
        }
        else
        {
            i = 0;
            while(i<R*C)
            {
                //最上一行
                for(int j=t;i<R*C && j<C-t;j++)
                {
                    b[t][j] = s[i++];
                }
                //最右侧列
                for(int j= t+1;i<R*C && j < R-t;j++)
                {
                    b[j][C-t-1] = s[i++];
                }
                //最下层行
                for(int j = C-t-2;i<R*C && j>=t;j--)
                {
                    b[R-t-1][j] = s[i++];
                }
            
                //最左侧列
                for(int j=R-t-2;i<R*C && j>t;j--)
                {
                    b[j][t] = s[i++];
                }
                
                t++;
            }
        }
        
        
        for(i=0;i<R;i++){          //最后输出b 
            for(l=0;l<C;l++){
                cout<<b[i][l];
            }
            
        }
        
        return 0; 
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月2日
  • 已采纳回答 10月25日
  • 修改了问题 10月24日
  • 创建了问题 10月24日

悬赏问题

  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥200 求能开发抖音自动回复卡片的软件
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。