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 }

原文地址:https://www.cnblogs.com/HonyLin/p/9572214.html

时间: 2024-10-19 21:24:12

Codeforces 1B Spreadsheets的相关文章

CodeForces 1B. Spreadsheets(模拟)

题目链接:http://codeforces.com/problemset/problem/1/B B. Spreadsheets time limit per test 10 seconds memory limit per test 64 megabytes input standard input output standard output In the popular spreadsheets systems (for example, in Excel) the following

【Codeforces 1B】Spreadsheets

[链接] 我是链接,点我呀:) [题意] A~Z分别对应了1~26 AA是27依次类推 让你完成双向的转换 [题解] 转换方法说实话特别恶心>_< int转string 得像数位DP一样一位一位地确定每一位是啥. 具体的 1位数可以表示16个数字 2位数又可以表示16*16个数字 根据这个算出来int对应的字符串是多少位数的 然后再一点一点地试出来每一位是多少即可 [代码] import java.io.*; import java.util.*; public class Main { st

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是整数,分别表示行号和列

1B. Spreadsheets

题意:将两种不同表达方式进行转换,即26进制与10进制的转换,特殊的是,比如:26用Z表示,27用AA表示,即没有零. 题目链接:http://codeforces.com/problemset/problem/1/B #include <stdio.h> #include <string.h> char str[100000]; void zhuan1(char str[],int len) { int s1=0; int s2=0; sscanf(str,"R%dC%

CodeForces Beta Round #1

Codeforces Beta Round #1 A. Theatre Square [题意]一个n*m的矩形广场,用a*a的方形石板铺设,问最少需要多少块石板能铺满广场. [思路]水题,从n方向来看能能够铺设ceil(n/a)块,从m方向来看能能够铺设ceil(m/a)块,总共有ceil(n/a)*ceil(m/a)块. 1 /* 2 ** CodeForces 1A Theatre Square 3 ** Created by Rayn @@ 2014/05/18 4 */ 5 #inclu

Codeforces 1A&amp;1B

1A. Theatre Square in the capital city of Berland has a rectangular shape with the size n × m meters. On the occasion of the city's anniversary, a decision was taken to pave the Square with square granite flagstones. Each flagstone is of the size a ×

Codeforces Beta Round #1 B. Spreadsheets

Codeblocks坏掉了,我不知道该怎么修,只能过两天重装系统了. 没办法.这个题是用Java写的,代码风格不好不要骂我~~ 题目大意: Excel表格那种坐标系统,和正常的坐标系统.用代码实现转换. 就是模拟题啊,代码量比较小. 下面是代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); i

Codeforces Beta Round #1 B. Spreadsheets 题解

题目链接:http://codeforces.com/contest/1/problem/B题目大意:<电子表格>电子表格的第1列标记为A,第2列标记为B,……,第26列标记为Z.然后我们用两个字符来进行:第27列标记为AA,第28列标记为AB,……,第52列标记为AZ.……在ZZ之后,我们再使用三个字符来表示.如是循环……所以对于电子表格中的某一个元素,我们都可以按照上述方法标识它的列.比如,对于第55列第23行的元素,我们可以用“BC23”来表示它.我们称这是“第一种表示”. 除了“第一种

Codeforces 1

A. Theatre Square: 题目地址:http://codeforces.com/contest/1/problem/A 题目大意:n*m的长方形用a*a的正方形覆盖,允许超出长方形,问需要几个正方形. 算法讨论:计算长和宽分别需要几个a,相乘即可. Code: #include <cstdio> #include <cmath> using namespace std; int n,m,a; int main(){ scanf("%d%d%d",&a