给你一串路径,譬如:
a\b\c
a\d\e
b\cst
d\
你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录的首字符向右缩两个空格,就像这样:
a
b
c
d
e
b
cst
d
注:同一级的需要按字母顺序排列,不能乱。
每个测试案例第一行为一个正整数n(n<=10)表示有n个路径,当n为0时,测试结束,接下来有n行,每行有一个字串表示一个路径,长度小于50。
输出目录结构,每一个测试样例的输出紧跟一个空行。
4 a\b\c a\d\e b\cst d\ 0
a b c d e b cst d
#include <stdio.h> #include <string.h> int main() { int n; char path[10][50]; char temp[50]; while(scanf("%d\n", &n) != EOF) { if(n == 0) break; for(int i = 0; i < n; ++i) scanf("%s\n", path[i]); for(int i = n - 1; i >= 1; --i) for(int j = 1; j <= i; ++j) if(strcmp(path[j-1], path[j]) > 0) { strcpy(temp, path[j - 1]); strcpy(path[j - 1], path[j]); strcpy(path[j], temp); } char path1[50], path2[50]; for(int k = 0; k < n; ++k) { strcpy(path2, path[k]); int space = 0; for(int i = 0, j = 0; i < strlen(path1), j < strlen(path2); ++i, ++j) { if(path1[i] == path2[j]) space++; else break; } for(int i = space; i < strlen(path2); ++i) { for(int j = 0; j < space; ++j) printf(" "); while(i < strlen(path2) && path2[i] != '\\') { printf("%c", path2[i++]); space++; } space++; printf("\n"); } strcpy(path1, path2); } printf("\n"); } }
#include <stdio.h> #include <string.h> int main() { int n, i, j, k, min; char path[10][50]; char temp[50]; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%s", path[i]); } for (i = 0; i < n; i++) { min = i; for (j = i + 1; j < n; j++) { if (strcmp(path[min], path[j]) > 0) { min = j; } } strcpy(temp, path[min]); strcpy(path[min], path[i]); strcpy(path[i], temp); } int num; for (i = 0; i < n; i++) { k = 0; num = 0; while (i != 0 && path[i][k] == path[i - 1][k]) //判断与上一行相同的字符中有几级结构,记录在num中 { if (path[i][k] == '\\') { num += 2; } k++; } for (j = 0; j < num; j++) //缩进 { printf(" "); } while (path[i][k] != '\0') //将与上一行不同的目录打印出来 { if (path[i][k] != '\\') { printf("%c", path[i][k]); } else if (path[i][k] == '\\' && path[i][k + 1] != '\0') { printf("\n"); num += 2; for (j = 0; j < num; j++) //缩进 { printf(" "); } } k++; } printf("\n"); } printf("\n"); return 0; }