零、题目链接:http://codeforces.com/contest/1/problem/B
一、审题
读完题目,题意清晰。说白了,就是先给了两种坐标形式:Excel表格里面每个单元格的列(字母组合)行(数字)坐标形式(e.g.BC23)与R(Row)XC(Column)Y坐标的形式,然后要求将一种转换成另一种,也就是互相转换。
然后需要转换坐标的数据量:n (1? ≤ n?≤?105)
坐标的数值大小范围:≤ 106
二、思路
首先根据输入的格式,我第一想法就是用vector<string>,很直观,因为 n 未知,用vector可以push_back(),而因为坐标有字母和数字,那么string类就很合适了。(想过去似乎用字符数组也可以,但没试)
因为要进行互相转化,那么分辨坐标形式就是必不可少的了。写一个函数去分辨。我觉得最好分辨的是RXCY的坐标形式,因为只要R后面是数字且在之后能找到C,那么就能确定这种形式。因为就两种,所以能分辨一个,另一个就一定能
被分辨。
分辨完,就是转换了。显而易见的是,对于两种坐标形式行(Column)都是数字形式,这给我们带来了便利。
所以从RXCY --> Excel形式,只要把X的部分截取到一个string对象里面,行(数字)的部分就完成了。对于列(字母组合)的完成,会麻烦一点,因为要先把Y部分的数字以int形式截取出来,然后进行10进制 --> 26进制的进制转化。有一个细
节,在下面说。
接着从Excel形式 --> RXCY形式,就更简单了,只要把BC转换成数字,然后数字部分直接截取出来,就行了,两者都用int即可,输出的时候加上R、C即可。
三、细节
这题细节我觉得就一个,就是前文说的在进制转换的时候,在遇到 26的倍数 要注意,因为刚好能整除,所以在用ASCII码值转换的时候,要和其他情况区别开,具体操作看代码。
四、代码
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 bool tell(const string &cell){ 6 bool sign = false; 7 if(cell[0] == ‘R‘ && (‘0‘ <= cell[1] && cell[1] <= ‘9‘)){ 8 for(int i = 2; i < (int) cell.size(); ++i){ 9 if(cell[i] == ‘C‘){ 10 sign = true; 11 break; 12 } 13 } 14 } 15 return sign; 16 } 17 18 int main(){ 19 ios::sync_with_stdio(false); 20 cin.tie(0); 21 int n; 22 cin >> n; 23 vector<string> cells; 24 for(int i = 0; i < n; ++i){ 25 string cell; 26 cin >> cell; 27 cells.push_back(cell); 28 } 29 for(auto &cell : cells){ 30 if(tell(cell)){ 31 //RXCY 32 int col = 0; 33 int num = 1; 34 string r_COL; 35 string COL; 36 for(int i = cell.size() - 1; ; --i){ 37 if(cell[i] != ‘C‘){ 38 col += (cell[i] - 48) * num; 39 num *= 10; 40 }else{ 41 break; 42 } 43 } 44 while(col > 0){ 45 char ch; 46 if(col % 26 == 0){ 47 ch = ‘Z‘; 48 col = col / 26 -1; 49 }else{ 50 ch = (col % 26) + 64; 51 col /= 26; 52 } 53 r_COL.push_back(ch); 54 } 55 for(int i = r_COL.size() - 1; i >= 0; --i){ 56 COL.push_back(r_COL[i]); 57 } 58 59 string ROW; 60 for(int i = 1; ; ++i){ 61 if(cell[i] != ‘C‘){ 62 ROW.push_back(cell[i]); 63 }else{ 64 break; 65 } 66 } 67 68 cout << COL + ROW << endl; 69 }else{ 70 //LETTERS+NUMBER BC23 71 int row = 0; 72 int num = 1; 73 for(int i = cell.size() - 1; ; --i){ 74 if(‘0‘ <= cell[i] && cell[i] <= ‘9‘){ 75 row += (cell[i] - 48) * num; 76 num *= 10; 77 }else{ 78 break; 79 } 80 } 81 82 int col = 0; 83 int num26 = 1; 84 for(int i = cell.size() - 1; i >= 0; --i){ 85 if(‘A‘ <= cell[i] && cell[i] <= ‘Z‘){ 86 col += (cell[i] - 64) * num26; 87 num26 *= 26; 88 } 89 } 90 91 cout << ‘R‘ << row << ‘C‘ << col << endl; 92 } 93 } 94 return 0; 95 }
原文地址:https://www.cnblogs.com/HonyLin/p/9572214.html