C语言给一个由英文大写字母组成的字符串,串长为n*n(0<n<11),请将这个按Z字形排列输出这个字符方阵。

比如: ABCDEFGHI,Z字形排成一个3*3的方阵如下:
ABF
CEG
DHI
输入
每行一个字符串。
输出
输出对应矩阵,每个矩阵之后有一个空行。

Sample Input

ABCDEFGHI
AAAABBBBCCCCDDDD

Sample Output

ABF
CEG
DHI

AABB
ABBD
ACCD
CCDD

#include<stdio.h>
#include<string.h>
#define N 11
int i,j;
int k;
int ln;
int n;
char s[N*N];
char a[N][N];
void go_right(){
    j++;
}
void go_left(){
    j--;
}
void go_down(){
    i++;
}
void go_up(){
    i--;
};
void left_down(){
    go_left();
    go_down();
}
void right_up(){
    go_right();
    go_up();
}
void go(){
    while(1){
        if(j+1 < n){
            go_right();a[i][j] = s[k];k++;//右移 
            if(k == ln +1) return;
        }
        else{
            go_down(); a[i][j] = s[k];k++;
            if(k == ln +1) return;
        }
       
        while(1){//左下移动 
            left_down();
            if(j >= 0 && i< n) {
                 a[i][j]=s[k]; k++;
                 if(k == ln +1) return;
            }
            else break;
        }
        j++;i--;//还原一步         
        
        if(i+1 < n){ 
            go_down();a[i][j] = s[k];k++;//向下 
            if(k == ln +1) return;
        }
        else{
            go_right();a[i][j] = s[k];k++;//右移
            if(k == ln +1) return;
        }
       
        while(1){//右上移动 
            right_up();
            if(i>=0 && j<n){
                a[i][j]=s[k]; k++;
                if(k == ln +1) return;
            }
            else break;    
        }
        i++;j--;//还原一步 
    }
}
void print(){
     i=j=0;
     for(i=0;i<n;i++){
         for(j=0;j<n;j++)
             printf("%c",a[i][j]);
         printf("\n");
     }
}
void Z(char s[]){
    ln = strlen(s);
    n = (int)sqrt(ln);
    k=0;
    i=j=0;
    a[i][j] = s[k];k++;
    go();
    print();
    return;
}
int main(){
    while(scanf("%s",s) != EOF){
        Z(s);
    }
    return 0;
}

追问

好长啊!!!!你好像掉了#include和printf("\n");
能解决我的问题,但是我一下子没理清思路,待我想想,谢谢

追答

主要是那几个函数,基本上一行代码都能搞定。
写来只是直观些。

谢谢啦

温馨提示:答案为网友推荐,仅供参考
相似回答