B - Spreadsheets CodeForces - 1B

在一些知名的表格处理系统中(比如:excel表格),我们经常用大写的字母来表示列,例如A表示第1列,B表示第2列,第26列用Z来表示,同时第27列我们用AA来表示,第28列我们用AB来表示,第29列我们用AC来表示,AZ表示第52列,ZZ之后我们就需要用3个字母来表示列了。

行的表示比较简单,我们一般用正整数来表示,比如1就表示第1行,5就表示第5行,行和列一起表示成为类似BC23的情况,这个表示在第23行,第55列。

有时候,我们的系统也会用RXCY的格式来表示,X和Y是整数,分别表示行号和列号。例如:R23C55表示的位置和之前那个例子是一样的。

你的任务是写一个程序,将这些位置在两种不同的表示方法之间转化。

Input

第一行是一个正整数n(1<=n<=10^5), 表示测试数据的数量。

接下来n行,每行一串字符,表示一个位置,输入保证所有的位置都是正确的,没有一个位置的行号或者列号超过10^ 6。

Output

输出n行,每行是对应的位置的转化结果。

Sample Input

2

R23C55

BC23

Sample Output

BC23

R23C55

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<stack>
#include<cstdlib>
#include<queue>
#include<set>
#include<string.h>
#include<vector>
#include<deque>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-10
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
typedef long long LL;
typedef long long ll;
const int MAXN = 1e6 + 5;
const int mod = 998244353;

bool is(char a) {
    if(‘A‘ <= a && a <= ‘Z‘)
        return true;
    return false;
}
int check(char *s)
{
    int len = strlen(s);
    int ans = 0,pos1 = -1,pos2 = -1;
    for(int i = 0 ;i < len; i++)
    {
        if(is(s[i]) && s[i] != ‘R‘ && s[i] != ‘C‘)
        {
            ans++;
            continue;
        }
        if(s[i] == ‘R‘) {
            ans ++;
            pos1 = i;
        }
        if(s[i] == ‘C‘) {
            ans++;
            pos2 = i;
        }
    }

    if(ans == 2 && pos1 != -1 && pos2 != -1 && pos2 - pos1 > 1)
        return 1;
    return 2;
}
//将一个数转换为A - Z的进制,比如3 -> C  34 -> AH  123 -> DS
void K(int n)
{
    if(n>26)
        K((n-1)/26);

    printf("%c",(n-1)%26+‘A‘);
}
int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        char s[MAXN];
        scanf("%s",s);
        int flag = check(s);
        //debug(flag);
        if(flag == 1) {
            int len = strlen(s);
            int pos1 = -1,pos2 = -1;
            for(int i = 0 ;i < len; i++)
            {
                if(s[i] == ‘R‘) {
                    pos1 = i;
                }
                if(s[i] == ‘C‘) {
                    pos2 = i;
                }
            }
            int p1 = 0,p2 = 0;
            for(int i = pos1 + 1; i < pos2; i++) {
                p1 *= 10;
                p1 += (s[i] - ‘0‘);
            }
            for(int i = pos2 + 1; i < len; i++) {
                p2 *= 10;
                p2 += (s[i] - ‘0‘);
            }
            char ch = ‘A‘;
            K(p2);
            printf("%d\n",p1);
        } else {
            int p1 = 0,p2 = 0;
            int len = strlen(s);
            int i;
            for(i = 0; i < len; i++) {
                if(is(s[i])) {
                    p1 *= 26;
                    p1 += s[i] - ‘A‘ + 1;
                }
                else
                    break;
            }

            for(i ; i < len ; i++) {
                p2 *= 10;
                p2 += s[i] - ‘0‘;
            }
            printf("R%dC%d\n",p2,p1);
        }
    }
}

原文地址:https://www.cnblogs.com/smallhester/p/11360907.html

时间: 2024-11-23 03:32:34

B - Spreadsheets CodeForces - 1B的相关文章

CodeForces 1B. Spreadsheets(模拟)

题目链接:http://codeforces.com/problemset/problem/1/B B. Spreadsheets time limit per test 10 seconds memory limit per test 64 megabytes input standard input output standard output In the popular spreadsheets systems (for example, in Excel) the following

Codeforces 1B Spreadsheets

零.题目链接:http://codeforces.com/contest/1/problem/B 一.审题 读完题目,题意清晰.说白了,就是先给了两种坐标形式:Excel表格里面每个单元格的列(字母组合)行(数字)坐标形式(e.g.BC23)与R(Row)XC(Column)Y坐标的形式,然后要求将一种转换成另一种,也就是互相转换. 然后需要转换坐标的数据量:n (1? ≤ n?≤?105) 坐标的数值大小范围:≤ 106 二.思路 首先根据输入的格式,我第一想法就是用vector<string

【Codeforces 1B】Spreadsheets

[链接] 我是链接,点我呀:) [题意] A~Z分别对应了1~26 AA是27依次类推 让你完成双向的转换 [题解] 转换方法说实话特别恶心>_< int转string 得像数位DP一样一位一位地确定每一位是啥. 具体的 1位数可以表示16个数字 2位数又可以表示16*16个数字 根据这个算出来int对应的字符串是多少位数的 然后再一点一点地试出来每一位是多少即可 [代码] import java.io.*; import java.util.*; public class Main { st

CodeForces Beta Round #1

Codeforces Beta Round #1 A. Theatre Square [题意]一个n*m的矩形广场,用a*a的方形石板铺设,问最少需要多少块石板能铺满广场. [思路]水题,从n方向来看能能够铺设ceil(n/a)块,从m方向来看能能够铺设ceil(m/a)块,总共有ceil(n/a)*ceil(m/a)块. 1 /* 2 ** CodeForces 1A Theatre Square 3 ** Created by Rayn @@ 2014/05/18 4 */ 5 #inclu

Codeforces 1A&amp;1B

1A. Theatre Square in the capital city of Berland has a rectangular shape with the size n × m meters. On the occasion of the city's anniversary, a decision was taken to pave the Square with square granite flagstones. Each flagstone is of the size a ×

Codeforces Beta Round #1 B. Spreadsheets

Codeblocks坏掉了,我不知道该怎么修,只能过两天重装系统了. 没办法.这个题是用Java写的,代码风格不好不要骂我~~ 题目大意: Excel表格那种坐标系统,和正常的坐标系统.用代码实现转换. 就是模拟题啊,代码量比较小. 下面是代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); i

1B. Spreadsheets

题意:将两种不同表达方式进行转换,即26进制与10进制的转换,特殊的是,比如:26用Z表示,27用AA表示,即没有零. 题目链接:http://codeforces.com/problemset/problem/1/B #include <stdio.h> #include <string.h> char str[100000]; void zhuan1(char str[],int len) { int s1=0; int s2=0; sscanf(str,"R%dC%

Codeforces Beta Round #1 B. Spreadsheets 题解

题目链接:http://codeforces.com/contest/1/problem/B题目大意:<电子表格>电子表格的第1列标记为A,第2列标记为B,……,第26列标记为Z.然后我们用两个字符来进行:第27列标记为AA,第28列标记为AB,……,第52列标记为AZ.……在ZZ之后,我们再使用三个字符来表示.如是循环……所以对于电子表格中的某一个元素,我们都可以按照上述方法标识它的列.比如,对于第55列第23行的元素,我们可以用“BC23”来表示它.我们称这是“第一种表示”. 除了“第一种

Codeforces 1

A. Theatre Square: 题目地址:http://codeforces.com/contest/1/problem/A 题目大意:n*m的长方形用a*a的正方形覆盖,允许超出长方形,问需要几个正方形. 算法讨论:计算长和宽分别需要几个a,相乘即可. Code: #include <cstdio> #include <cmath> using namespace std; int n,m,a; int main(){ scanf("%d%d%d",&a