B - Spreadsheets CodeForces - 1B

Posted smallhester

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
        
    

 

以上是关于B - Spreadsheets CodeForces - 1B的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Beta Round #1 B. Spreadsheets 题解

Codeforces 1B Spreadsheets

CF1B Spreadsheets

使用Excel或Google SpreadSheets公式为单元格中的每个单词添加加号

javascript Google Spreadsheets

CODEFORCES 1B Spreadsheets