Codeforces 1B Spreadsheets

零、题目链接: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 }

猜你喜欢

转载自www.cnblogs.com/HonyLin/p/9572214.html
今日推荐