显示器 OpenJ_Bailian - 2745(打表)

结题思路:本题其实难度不大,就是有点繁琐,首先用一个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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值