题目链接:http://poj.org/problem?id=1102
题目意思:就是根据给出的格式 s 和 数字 n,输出数值 n 的 LCD 显示。数值 n 的每个数字要占据 s + 2 列 和 2s + 3 行。数字和数字之间要有一个空格。数值与数值之间有一个空行。
首先对于LCD 的 7 个笔画显示编上序号
然后对于数字 i,分析出占用了哪几个笔画,例如,数字 1 占有的笔画是 3 和 6;数字 6 占有的笔画是 1, 2, 4, 5, 6, 7
用数组来存储每一个笔画分别被那些数字占有,如果是打横的笔画,就放在 horizontal[][] 上;打竖的笔画放在 vertical[][]。然后根据数值 n 来根据对应的horizontal[][] 和 vertical[][] 的占有情况来输出。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 const int maxrow = 4 + 2; 8 const int maxcol = 10 + 2; 9 10 // 数字0~9占有的笔画编号 11 // 打横的笔画,笔画编号分别为: 1 4 7 12 char horizontal[maxrow][maxcol] = {"- -- -----", " ----- --", "- -- -- --"}; 13 // 打竖的笔画,笔画编号分别为: 2 3 5 6 14 char vertical[maxrow][maxcol] = {"| ||| ||", "||||| |||", "| | | | ", "|| |||||||"}; 15 char n[maxcol]; 16 int s, len; 17 18 void get_horizontal(int row) 19 { 20 for (int j = 0; j < len; j++) 21 { 22 printf(" "); 23 for (int i = 1; i <= s; i++) 24 printf("%c", horizontal[row][n[j]-‘0‘]); 25 printf(" "); 26 } 27 } 28 29 void get_vertical(int row) 30 { 31 for (int j = 0; j < len; j++) 32 { 33 printf("%c", vertical[row][n[j]-‘0‘]); 34 for (int i = 1; i <= s; i++) 35 printf(" "); 36 printf("%c ", vertical[row+1][n[j]-‘0‘]); 37 } 38 } 39 40 int main() 41 { 42 #ifndef Online_Judge 43 freopen("in.txt", "r", stdin); 44 #endif // Online_Judge 45 while (scanf("%d%s", &s, n) != EOF) 46 { 47 if (s == 0 && !strcmp(n, "0")) 48 break; 49 len = strlen(n); 50 for (int i = 1; i <= 2*s+3; i++) // 2s+3 行 51 { 52 if (i == 1) // 第 1 行 53 get_horizontal(0); 54 else if (i > 1 && i < s+2) // 第 2 ~ s+1 行 55 get_vertical(0); 56 else if (i == s+2) // 第 s+2 行 57 get_horizontal(1); 58 else if (i > s+2 && i < 2*s+3) // 第 s+3 ~ 2s+2 行 59 get_vertical(2); 60 else 61 get_horizontal(2); // 第 2s+3 行 62 printf("\n"); 63 } 64 printf("\n"); 65 } 66 printf("\n"); // 这个空行是是否 wa 的关键!比较卑鄙= = 67 return 0; 68 }
时间: 2024-10-26 13:26:19