HDU1200 To and Fro

题目传送门 http://acm.hdu.edu.cn/showproblem.php?pid=1200

这道题挺简单的,我想到了两种办法,第一种就是常规的按照题目的意思画出矩阵,然后输出

#include <cstdio>
#include <cstring>
using namespace std;

#define MAXSIZE 210

int main(){
    int n;
    char a[MAXSIZE];
    char b[MAXSIZE][MAXSIZE];   //作为矩阵
    scanf("%d", &n);
    getchar();
    while(n != 0){
        gets(a);
        int index = 0;
        int j=0;    //第一坐标
        int change = 1; //1表示从左往右,-1表示从右往左
        while(a[index] != '\0'){
            if(change == 1){
                for(int i=0; i<n; i++){
                    b[j][i] = a[index];
                    index++;
                }
            } else if(change == -1){
                for(int i=n-1; i>=0; i--){
                    b[j][i] = a[index];
                    index++;
                }
            }
            change = -change;   //左右交换
            j++;    //行加一
        }
        //输入完了之后要打印
        for(int k=0; k<n; k++){
            for(int p=0; p<j; p++){
                printf("%c", b[p][k]);
            }
        }
        printf("\n");
        scanf("%d", &n);
        getchar();
    }
    return 0;
}

第二种办法有点类似于归并排序的思想,对字符串进行分组输出,不过要注意的是在分组的时候从0开始的话那么偶数组是从左往有输出,而奇数组则是从右往左输出

#include <cstdio>
#include <cstring>
using namespace std;

#define MAXSIZE 210

int main(){
    int n;
    char a[MAXSIZE];
    scanf("%d", &n);
    getchar();
    while(n != 0){
        gets(a);
        int length = strlen(a);
        int group = length / n; //组数
        //分5次输出
        for(int i=0; i<n; i++){ //i表示组内偏移量
            for(int j=0; j<group; j++){
                if(j%2 == 0){
                    printf("%c", a[j*n + i]);
                } else if(j%2 == 1){
                    printf("%c", a[j*n + n-1-i]);
                }
            }
        }
        printf("\n");
        scanf("%d", &n);
        getchar();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/haohulala/article/details/89404123
今日推荐