Description

Nowadays, there are smartphone applications that instantly translate text and even solve math problems if you just point your phone’s camera at them. Your job is to implement a much simpler functionality reminiscent of the past — add two integers written down as ASCII art.

An ASCII art is a matrix of characters, exactly 7 rows high, with each individual character either a dot (.) or the lowercase letter ‘x’.

An expression of the form a + b is given, where both a and b are positive integers. The expression is converted into ASCII art by writing all the expression characters (the digits of a and b as well as the ‘+’ sign) as 7 × 5 matrices, and concatenating the matrices together with a single column of dot characters between consecutive individual matrices. The exact matrices corresponding to the digits and the ‘+’ sign are as folows:

xxxxx   ....x   xxxxx   xxxxx   x...x   xxxxx   xxxxx   xxxxx   xxxxx   xxxxx   .....
x...x ....x ....x ....x x...x x.... x.... ....x x...x x...x ..x..
x...x ....x ....x ....x x...x x.... x.... ....x x...x x...x ..x..
x...x ....x xxxxx xxxxx xxxxx xxxxx xxxxx ....x xxxxx xxxxx xxxxx
x...x ....x x.... ....x ....x ....x x...x ....x x...x ....x ..x..
x...x ....x x.... ....x ....x ....x x...x ....x x...x ....x ..x..
xxxxx ....x xxxxx xxxxx ....x xxxxx xxxxx ....x xxxxx xxxxx .....

Given an ASCII art for an expression of the form a + b, find the result of the addition and write it out in the ASCII art form.

Input

The input file contains several test cases, each of them as described below.

Input consists of exactly 7 lines and contains the ASCII art for an expression of the form a + b,

where both a and b are positive integers consisting of at most 9 decimal digits and written without leading zeros.

Output

For each test case, output 7 lines containing ASCII art corresponding to the result of the addition, without leading zeros.

Sample Input

....x.xxxxx.xxxxx.x...x.xxxxx.xxxxx.xxxxx.......xxxxx.xxxxx.xxxxx
....x.....x.....x.x...x.x.....x.........x...x...x...x.x...x.x...x
....x.....x.....x.x...x.x.....x.........x...x...x...x.x...x.x...x
....x.xxxxx.xxxxx.xxxxx.xxxxx.xxxxx.....x.xxxxx.xxxxx.xxxxx.x...x
....x.x.........x.....x.....x.x...x.....x...x...x...x.....x.x...x
....x.x.........x.....x.....x.x...x.....x...x...x...x.....x.x...x
....x.xxxxx.xxxxx.....x.xxxxx.xxxxx.....x.......xxxxx.xxxxx.xxxxx

Sample Output

....x.xxxxx.xxxxx.xxxxx.x...x.xxxxx.xxxxx
....x.....x.....x.x.....x...x.x.........x
....x.....x.....x.x.....x...x.x.........x
....x.xxxxx.xxxxx.xxxxx.xxxxx.xxxxx.....x
....x.x.........x.....x.....x.....x.....x
....x.x.........x.....x.....x.....x.....x
....x.xxxxx.xxxxx.xxxxx.....x.xxxxx.....x

Analyze:

  目前遇到过最恶心的模拟题之一。训练赛听说只有我是用char肝的我瞬间冒冷汗。各自边界计算弄得我头都大了。一个恶心点是此题给出的样例只有一个,但是特么自己写样例麻烦的一批。这里我提供一个自己写的样例:

....x.xxxxx.......xxxxx
....x.....x...x...x...x
....x.....x...x...x...x
....x.xxxxx.xxxxx.xxxxx
....x.x.......x...x...x
....x.x.......x...x...x
....x.xxxxx.......xxxxx

加上题目的样例都能过的话那就基本没问题了。

里面digits的算法是通过方程得到的。字符(数字或加号)的宽度是5,假设有n个字符,那么宽度就是5n;n个字符间有n-1个'.',所以行的总长度就是5n+n-1 = 6*n-1 = len,推出n=(len+1)/6

Code

#include <cstdio>
#include <cstring>
#include <cmath>
struct Num{
const char* n[7]; //每个结构体内部是一个储存7行字符串指针的数组
}nums[11]={
{
"xxxxx",
"x...x",
"x...x",
"x...x",
"x...x",
"x...x",
"xxxxx"
},
{
"....x",
"....x",
"....x",
"....x",
"....x",
"....x",
"....x"
},
{
"xxxxx",
"....x",
"....x",
"xxxxx",
"x....",
"x....",
"xxxxx"
},
{
"xxxxx",
"....x",
"....x",
"xxxxx",
"....x",
"....x",
"xxxxx"
},
{
"x...x",
"x...x",
"x...x",
"xxxxx",
"....x",
"....x",
"....x"
},
{
"xxxxx",
"x....",
"x....",
"xxxxx",
"....x",
"....x",
"xxxxx"
},
{
"xxxxx",
"x....",
"x....",
"xxxxx",
"x...x",
"x...x",
"xxxxx"
},
{
"xxxxx",
"....x",
"....x",
"....x",
"....x",
"....x",
"....x"
},
{
"xxxxx",
"x...x",
"x...x",
"xxxxx",
"x...x",
"x...x",
"xxxxx"
},
{
"xxxxx",
"x...x",
"x...x",
"xxxxx",
"....x",
"....x",
"xxxxx"
},
{
".....",
"..x..",
"..x..",
"xxxxx",
"..x..",
"..x..",
"....."
}
};
char ccin[7][120]; // 保存输入的式子
char ccout[7][120]; // 保存最后输出的式子
int cmp(int index){ // 判断对应方块的数字是否在预设数字里
for(int m = 0;m < 10;m ++){
bool ok = true;
for(int i = 0;i < 7;i ++)
for(int j = 0;j < 5;j ++)
if(nums[m].n[i][j]!=ccin[i][j+index]){ ok=false; break;}
if(ok) return m;
}
return -1; // 如果没找到说明此方块内是加号,返回-1
}
int ccount(int sum){ //计算和的位数
int c = 0;
while(sum){
sum /= 10; ++c;
}
return c;
}
int main()
{
while(~scanf("%s",ccin[0])){
for(int i = 1;i < 7;i ++) scanf("%s",ccin[i]);
int len = strlen(ccin[0]);
int digits = (len+1)/6; // 计算有多少个数
int sum = 0,mul = 1,i;
for(i = 0;i < digits;i ++){
int bit = cmp(len-1-(4+i*6));
if(bit<0){ len = len-1-(4+i*6)-1; break; }
sum += bit*mul; // 累加
mul *= 10;
}
digits -= i + 1; mul = 1;
for(i = 0;i < digits;i ++){
int bit = cmp(len-1-(4+i*6));
sum += bit*mul;
mul *= 10;
}
int final = ccount(sum);
for(i = 0;i < final;i ++){
int e = 1;
for(int l = 0;l < final - 1 - i;l ++)
e*=10;
int bit = sum / e;
sum-=e*bit;
for(int j = 0;j < 7;j ++){
for(int k = 0;k < 5;k ++)
ccout[j][k+i*6] = nums[bit].n[j][k];
if(i!=final-1) ccout[j][(i+1)*6-1]='.';
}
}
for(i = 0;i < 7;i ++)
printf("%s\n",ccout[i]);
memset(ccin,0,sizeof(ccin)); memset(ccout,0,sizeof(ccout));
}
return 0;
}

[C++]UVaLive7324 ASCII Addtion的更多相关文章

  1. SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码

    参考文章:微信公众号文章 在sql中怎么查看一个字符的ascii编码,so easy !! select ASCII('a') SELECT CHAR(97) charNum SELECT UNICO ...

  2. perl 如何匹配ASCII码以及ASCII码转换

    匹配ASCII码:   /[:ascii:]/ ASCII码转换为数字: ord() 数字转换为ASCII码: chr()

  3. 常用ASCII CHR碼對照

    因為開發需求,把對照表留下來一下. Chr(0) Null Chr(29) 分组符 Chr(38) & Chr(48) 0 Chr(8) 退格 Chr(30) 記錄分離符號 Chr(39) ‘ ...

  4. ascii、unicode、utf、gb等编码详解

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ...

  5. ASCII码而已

    题目: \u5927\u5bb6\u597d\uff0c\u6211\u662f\u0040\u65e0\u6240\u4e0d\u80fd\u7684\u9b42\u5927\u4eba\uff01 ...

  6. python2.7 报错(UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128))

    报错: 原来用的python3.5版本后来改为2.7出现了这个错误里面的中文无法显示 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 ...

  7. ASCII码、Unicode码 转中文

    ASCII码.Unicode码 转中文 在最近工作中遇到了一些汉字编码转换的处理,可以通过正则表达式及转换字符来实现转成中文 Unicode转换示例 通常为10位编码, 通过digit参数传入 pri ...

  8. ASCII字符集中的功能/控制字符

       ASCII字符集中的功能/控制字符     Function/Control Code/Character in ASCII Version: 2011-02-15 Author: gree ...

  9. ASCII和16进制对照表

    十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII 控制字符 1 00 NUL 空字符 01 SOH 标题起始 (Ctrl/A) 02 STX 文本起始 (Ctrl/B) 03 ETX ...

随机推荐

  1. Cannot connect to WMI Provider & Invalid class [0x80041010]

    数据库服务器(Virtual Machine)所在的Nutanix一台主机由于故障,VM自动切换到另一台主机,切换过程中VM会重新启动,但是早上检查的时候,发现点击SQL Server Configu ...

  2. ORACLE复制表结构

    一般网上的方法: ; --复制表结构以及数据按where条件查询出的数据 ; --只复制表结构 但是上面的语法不会复制旧表的默认值.注释.键和索引,因此想要完美的复制表结构就需要先找到旧表的sql语句 ...

  3. vmware 6 虚拟化 全系列 序列号

    vmware 6 虚拟化 全系列 序列号   vSphere 6 Hypervisor HY0XH-D508H-081U8-JA2GH-CCUM2 4C4WK-8KH8L-H85J0-UHCNK-8C ...

  4. java网络爬虫基础学习(二)

    正则表达式 正则表达式写法 含义 \d 代表0-9的任意数字 \D 代表任何非数字字符 \s 代表空格类字符 \S 代表非空格类字符 \p{Lower} 代表小写字母[a-z] \p{Upper} 代 ...

  5. 微信、qq可以上网,但是浏览器却不能上网怎么办

    问题描述:微信.qq可以上网,但是浏览器却不能上网怎么办? 解决办法(步骤如下):(1)打开360安全卫士,点击更多 (2)进入到更多中,点击断网急救箱 (3)进入到断网急救箱,点击全面诊断 (4)一 ...

  6. Windows下切分文件(GnuWin32)

    windows下碰到查看大日志文件还真麻烦,今天找了个工具来做这个:安装GnuWin32,然后用里面的split命令分割日志文件 ps:发现intellij idea还挺好,超过2g的日志文件也能进行 ...

  7. Win7删除右键菜单中“图形属性”和“图形选项”

    完win7操作系统后,打完驱动在桌面右键会出现如下两个选项,平时没啥用又占用空间,那么如何删掉这两个选项呢? 操作步骤: 1.在运行中输入 regedit 确定打开注册表: 2.依次单击展开HKEY_ ...

  8. MySQL实现按天统计数据的方法

    一.首先生成一个日期表,执行SQL如下: CREATE TABLE num (i int); ), (), (), (), (), (), (), (), (), (); CREATE TABLE i ...

  9. java基础-03基本语法

    关键词 常用关键字53个(含2个保留字): 1.保留关键字(2个) const --常量 常数:用于修改字段或局部变量的声明. goto--转到 指定跳转到标签,找到标签后,程序将处理从下一行开始的命 ...

  10. 使用py,根据日志记录自动生成周报

    日志格式如下,思路是如果检测到文件中的内容为5位或者8位,即12.11或18.12.11,同时存在.即认为当前行为日期数据仅作为方便查看日志使用,生成脚本时过滤此行.每次读取到空白行的时候则认为下一条 ...