Educational Codeforces Round 1 B. Spreadsheets
B. Spreadsheets
問題
RXCY(X行目Y列目)形式とABC123(列の文字,行の数字)形式をお互いに転換するプログラムを作りなさい.
解法
まずはどの形式であるかを判断する.
判断方法は前半が全部英字,後半が全部数字でしたらABC123形式.
そうでないならRXCY形式.
それぞれの形式から行数と列数を求めて.他の形式へ適応する.
まとめると:
形式を判断する
↓
共通の行列座標を求める
↓
違う形式へ転換
分類
文字列処理
コード
#include <bits/stdc++.h> using namespace std; //const double PI = acos(-1); using ll = long long; using ull = unsigned long long; const int inf = 2e9; const ll INF = 4e18; const ll MOD = 1e9+7; typedef pair<int,int> P; //ABC123形式であるかを判断する bool isA(string s) { bool f = 0; for (int i = 0; i < s.size(); i++) { if ('0' <= s[i] && s[i] <= '9') { f = 1; } else { if (f) return 0; } } return 1; } //RXCY形式への転換 void A(string s) { ll r = 0, c = 0; for (int i = 0; i < s.size(); i++) { if ('0' <= s[i] && s[i] <= '9') { r *= 10; r += s[i] - '0'; } else { c *= 26; c += s[i] - 'A' + 1; } } cout << 'R' << r << 'C' << c << endl; } //ABC123形式への転換 void B(string s) { string r = ""; ll c = 0; bool f = 0; for (int i = 0; i < s.size(); i++) { if (s[i] == 'C') f = 1; else if (f) { c *= 10; c += s[i] - '0'; } else if (s[i] != 'R') { r += s[i]; } } string cc = ""; while (c) { c--; cc = (char)('A' + (c%26)) + cc; c /= 26; } cout << cc << r << endl; } int main(){ ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; while (n--) { string s; cin >> s; if (isA(s)) { A(s); } else { B(s); } } return 0; }