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