Barty 的表格

xiaoxiao2021-02-28  125

( 程序文件名: excel. pas/c/cpp)  【问题描述】 Excel 中的列号是使用大写字母标识的,第一列是 A,第二列是 B,然后依 次标下去,第 26 列是 Z。之后列号变为两位从 AA~ZZ 以字典顺序标识 (AA,AB,AC...AZ,BA,BB,BC....ZZ) 。 再 之 后 列 号 变 为 三 位 大 写 字 母 AAA---ZZZ(AAA,AAB,AAC...AAZ,ABA...ZZZ),依次类推。 Excel 中的行号是使用数字标识的,从 1 开始表示第 1 行,第 2 行,第 3 行…… 一直标下去。 Barty 手中有一份非常大的表格数据,他想得知某些单元格的内容,但是他 不知道 Excel 中这些单元格的行号和列号分别是什么,于是请你编写程序来 帮帮他。 【输入文件】文件名: excel.in 第一行两个正整数,数据表格允许的最大行列数m和要查询的单元格数量n(n <= 100)。 接下来 n 行,每行一条格式为“X NUM X NUM”的查询 X 是一个大写字母‘R’或‘C’,表示行或列,NUM 为一个整数 (0<= NUM <= 10^9)。 【输出文件】文件名: excel.out 对每一条查询,所在单元格的行号和列号,用一个空格隔开 若单元格不存在,输出-1 每条查询占一行。 【样例输入】 100 3 R 23 C 26 R 94 C 27 R 59 C 102 【样例输出】 23 Z 94AA -1 分析:

题目改编于某国外OJ中一题。当时一眼看上去就觉得很水,没仔细想就敲,结果Wrong Answer好多次。Bella把题目简化后放到这里,目的是强调一下细心。

长度为1的字符串有26个,长度为2的有26*26个……因此我们首先可以确定列号对应的字符串长度。然后就是26进制的数字转化了,组合方法也好暴力转化也好,都需要想清楚边界全A和全Z的情况。

另卡了两个小Trick,就是两个R两个C这种单元格算做不存在的,并且题目中有说行号列号都从1开始,0是不存在的。(Bella很坏吧~)       特判之后,主要要解决的就是进制转化问题,A~Z共有26个,很容易想到这是一个26进制,但是如果直接mod26的话肯定会错的!因为题目上说数字是从1开始的,想一想平常的10进制是0~9的,类比一下26进制应该是0~25的,那么如果从数字1开始的话肯定要多算一个,所以要减去1,具体过程看代码。

代码: #include<iostream> #include<cstdio> #include<cstring> #include<iostream> using namespace std; int m,n; void pt(int x) { x=x-1; int t=x&; x=x/26; if(x) pt(x); putchar('A'+t); return; } int main() { freopen("excel.in","r",stdin); freopen("excel.out","w",stdout); scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) { char a[3],b[3]; int a1,b1; scanf("%s%d%s%d",a,&a1,b,&b1); if(a[0]!='R') swap(a1,b1); if(a1>m||a1<1||b1>m||b1<1||a[0]==b[0]) {printf("%d\n",-1);continue;} printf("%d ",a1); pt(b1); printf("\n"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-47880.html

最新回复(0)