结题思路:本题其实难度不大,就是有点繁琐,首先用一个map来存储数字,题目可知,一个数字占s+3列(因为每个数字之后还有一列空格),每个数字需要考虑的就是3行2列,3行是第0行,第s+1行,第2s+2行,两列是最左边一列和最右边一列,其他地方都是空格。对于第i个数字来说,最左边的列号是i(s+3),最右边的列号是(i+1)*(s+3)-1。
#include <stdio.h>
#include <string.h>
char map[23][120];
char str[8];
//函数传二维数组时,第二维的大小不可省略
void build (char map[][120], int s)
{
int i;
for(i = 0; i < strlen(str); i++)
{
int tmp = str[i] - '0';
int l = i*(s+3); //每个数字的最左边一列
int r = (i+1)*(s+3)-1; //每个数字的最右边的那一列空格
switch (tmp)
{
case 0:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == 0 || x == 2*s + 2)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x > 0 && x < s+1)
{
map[x][l] = '|';
map[x][r-1] = '|';
}
if(x > s+1 && x < 2*s + 2)
{
map[x][l] = '|';
map[x][r-1] = '|';
}
}
break;
}
case 1:
{
for(int x = 0; x < 2*s + 3; x++)
{
if( x == 0 || x == s+1 || x == 2*s + 2)
continue;
map[x][r-1] = '|';
}
break;
}
case 2:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == 0 || x == s+1 || x == 2*s + 2)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x > 0 && x < s+1)
map[x][r-1] = '|';
if(x > s+1 && x < 2*s + 2)
map[x][l] = '|';
}
break;
}
case 3:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == 0 || x == s+1 || x == 2*s + 2)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x > 0 && x < s+1 || x > s+1 && x < 2*s + 2)
map[x][r-1] = '|';
}
break;
}
case 4:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == s+1)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x > s+1 && x < 2*s + 2)
map[x][r-1] = '|';
if(x > 0 && x < s+1)
{
map[x][l] = '|';
map[x][r-1] = '|';
}
}
break;
}
case 5:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == 0 || x == s+1 || x == 2*s + 2)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x > 0 && x < s+1)
map[x][l] = '|';
if(x > s+1 && x < 2*s + 2)
map[x][r-1] = '|';
}
break;
}
case 6:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == 0 || x == s+1 || x == 2*s + 2)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x > s+1 && x < 2*s + 2)
{
map[x][l] = '|';
map[x][r-1] = '|';
}
if(x > 0 && x < s+1)
map[x][l] = '|';
}
break;
}
case 7:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == 0)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x == 0 || x == s+1 || x == 2*s+2)
continue;
map[x][r-1] = '|';
}
break;
}
case 8:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == 0 || x == s+1 || x == 2*s + 2)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x > 0 && x < s+1 || x > s+1 && x < 2*s + 2)
{
map[x][l] = '|';
map[x][r-1] = '|';
}
}
break;
}
case 9:
{
for(int x = 0; x < 2*s + 3; x++)
{
if(x == 0 || x == s+1 || x == 2*s+2)
for(int y = l+1; y < r-1; y++)
map[x][y] = '-';
if(x > s+1 && x < 2*s + 2)
map[x][r-1] = '|';
if(x > 0 && x < s+1)
{
map[x][l] = '|';
map[x][r-1] = '|';
}
}
break;
}
}
}
//必须要在每一行后面加上'\0'。
for(int x = 0; x < 2*s+3; x++)
map[x][(i+1)*(s+3)] = '\0';
}
int main()
{
int s;
bool flag = true;
while(scanf("%d %s", &s, str) && s != 0)
{
if(flag)
flag = false;
else
printf("\n");
//memset二维字符数组的初始化。
memset(map, ' ', sizeof(map));
build(map, s);
for(int i = 0; i < 2*s+3; i++)
printf("%s\n", map[i]);
}
return 0;
}