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); } } }