Barty 的表格

来源:互联网 发布:java 文本聚类 编辑:程序博客网 时间:2024/06/05 07:14
( 程序文件名: 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%26;    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;}


原创粉丝点击