zoukankan      html  css  js  c++  java
  • CF1B_Spreadsheets 题解

    Spreadsheets / 电子表格

    CodeForce Round 1 B

    原题链接:CF1B

    题目描述

    In the popular spreadsheets systems (for example, in Excel) the following numeration of columns is used. The first column has number A, the second — number B, etc. till column 26 that is marked by Z. Then there are two-letter numbers: column 27 has number AA, 28 — AB, column 52 is marked by AZ. After ZZ there follow three-letter numbers, etc.

    The rows are marked by integer numbers starting with 1. The cell name is the concatenation of the column and the row numbers. For example, BC23 is the name for the cell that is in column 55, row 23.

    Sometimes another numeration system is used: RXCY, where X and Y are integer numbers, showing the column and the row numbers respectfully. For instance, R23C55 is the cell from the previous example.

    Your task is to write a program that reads the given sequence of cell coordinates and produce each item written according to the rules of another numeration system.

    输入格式

    The first line of the input contains integer number n( (1<=n<=10^{5}) ), the number of coordinates in the test. Then there follow nn lines, each of them contains coordinates. All the coordinates are correct, there are no cells with the column and/or the row numbers larger than 10^{6}106 .

    输出格式

    Write nlines, each line should contain a cell coordinates in the other numeration system.

    题意翻译

    人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:

    第一列被标为A,第二列为B,以此类推,第26列为Z。接下来为由两个字母构成的列号: 第27列为AA,第28列为AB...在标为ZZ的列之后则由三个字母构成列号,如此类推。

    行号为从1开始的整数。

    单元格的坐标由列号和行号连接而成。比如,BC23表示位于第55列23行的单元格。

    有时也会采用被称为RXCY的坐标系统,其中X与Y为整数,坐标(X,Y)直接描述了对应单元格的位置。比如,R23C55即为前面所述的单元格。

    您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式。

    输入

    第一行一个整数n((1<=n<=10^5)),表示将会输入的坐标的数量。

    接下来n行,每行一个坐标。

    注意: 每个坐标都是正确的。此外不会出现行号或列号大于(10^6)的单元格。

    输出

    n行,每行一个被转换的坐标。

    输入输出样例

    输入 #1

    2
    R23C55
    BC23
    

    输出 #1

    BC23
    R23C55
    

    思路

    根据题意,一个单元格有两种表示方法。

    • Excel表示法

      第一列被标为A,第二列为B,以此类推,第26列为Z。接下来为由两个字母构成的列号: 第27列为AA,第28列为AB...在标为ZZ的列之后则由三个字母构成列号,如此类推。

      行号为从1开始的整数。

      这里可以理解为列是26进制的,(A,B,C……Z)分别对应(1,2,3、……26),其中(A)对应的是(1)而不是(0);

      而行是10进制的;

    • RXCY表示法

      有时也会采用被称为RXCY的坐标系统,其中X与Y为整数,坐标(X,Y)直接描述了对应单元格的位置。比如,R23C55即为前面所述的单元格。

      RXCY表示法很好理解,R=row=行,C=column=列;

      弄清楚两种表示方法之后,可以发现,我们要解决的问题就是把这两种进行转换就行了

      坑点1:两种进制都是从1开始的,没有0的情况,所以在转26进制的时候,m%26 == 0这种情况应该判定为 Z,而不是0

      坑点2:判断输入的数据是哪种表示方法,从而转换成另一种;

      参考程序

      #include<bits/stdc++.h>
      using namespace std;
      int n;
      int r = 0, c = 0;
      string data,ans;
      
      void toExcel()
      {
      	int i;
      	r=0;//血泪教训,开始r,c忘记重新置0,导致不能只有第一个结果是对的
      	c=0;
      	for(i = 1; data[i] != 'C'; i++)//提取行数r
      		r = r * 10 + data[i] - '0';
      	for(i++; data[i] != ''; i++)//提取列数c
      		c = c * 10 + data[i] - '0';
      	i=0;
      	while(c > 0) //列数转换成特殊的26进制
      	{
      		if(c % 26 == 0) //坑点, 当c%26==0的时候要向高位减去1
      		{
      			ans[i] = 'Z';//特殊点,当%的结果=0的时候,要用Z表示
      			c = c / 26 -1;
      		}
      
      		else
      		{
      			ans[i] = 'A' + c % 26 -1;
      			c /= 26;
      		}
      		i++;
      	}
      	for(i--; i>=0; i--) //逆序输出,从高位到低位
      		cout << ans[i];
      	cout << r << endl;
      	return ;
      }
      
      void toRXCY()
      {
      	int i;
      	r=0;
      	c=0;
      	for(i = 0; data[i] >= 'A' and data[i] <= 'Z'; i++)//26进制转10进制
      		c = c * 26 + (data[i] - 'A' + 1);
      	for(i; data[i] >= '0' and data[i] <= '9'; i++)//提取行数r
      		r = r * 10 + data[i] - '0';
      	cout << 'R' << r << 'C' << c << endl;
      	return ;
      
      }
      int main()
      {
      	cin >> n;
      	for(int k=1; k<=n; k++)
      	{
      		cin >> data;
      		int flag = 0;
      		for(int i = 0; i<data.length() - 1; i++)
      			if(data[i] >= '0' and data[i] <= '9' and data[i+1] >= 'A' and data[i+1] <= 'Z')//根据格式特性,判断是Excel格式还是RXCY格式
      				flag = 1;
      		if(flag)
      			toExcel();
      		else
      			toRXCY();
      	}
      	return 0;
      }
      

      总结

    这道题的主要考察点是进制转换和模拟,整个模拟过程比较简单,但是进制转换比一般的进制转换要难,具有特殊性。不考虑26进制进位容易出错。

  • 相关阅读:
    阶梯博弈
    hihoCoder #1199 : Tower Defense Game ——(树型dp)
    2016 China-Final-F题 ——(SA+二分)
    ACM之路(20)—— Splay初探
    2016 ICPC China-Final 现场赛总结
    【Interleaving String】cpp
    【Best Time to Buy and Sell Stock III 】cpp
    【Maximal Rectangle】cpp
    【palindrome partitioning II】cpp
    【Maximum Subarray 】cpp
  • 原文地址:https://www.cnblogs.com/dengfull/p/11706451.html
Copyright © 2011-2022 走看看