题目传送门 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;
}