<洛谷>cf一道通过率极低的字符串模拟问题
<Spreadsheets>
思路
这个题意是一目了然的,但是我们想要轻松地把这道题模拟出来并不是一件容易的事。题目要求我们用代码实现两种不同形式坐标的相互转化并输出结果。
那么,我们首先需要考虑的是这个问题实际上是在考察我们什么,从A-Z,都使用过之后就要进入下一轮,那么我们是不是可以将这个过程抽象成一种进制的转化。也就是26进制和10进制的转化。
那好,我们知道他的考点之后就可以想思路了,我们需要对两种不同情况分别进行转化,如果是BC23要转化成R23C55,那么我们需要分别记录下来BC和23,对于23,我们只需要在前面加上R,然后等待输出就好,我们的重点在于如何处理这个烦人的BC,如果我们开头没有明确他是在考察进制转换,那么我们就会走很大一段 的弯路,而且最后的效果可能还不尽如人意。那么我们就可以对于BC通过记录位数来进行进制转化(具体可以直接参考代码), 而对于R23C55这样的坐标,我们在转化时就应该着重考虑55在进行转化时的细节,比如26是可以输出Z的,但0不会输出A,而是输出了@,我们就需要加入特判(具体直接参考代码)进行判断处理了
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
int powl(int x, int n)
{
int res = 1;
while (n--)
{
res *= x;
}
return res;
}
int main()
{
int n;
cin >> n;
while (n--)
{
string st;
cin >> st;
bool t = false;
for (int i = 0; i < st.size(); ++i)
{
if (st[i] == 'C' && st[i - 1] >= '0' && st[i - 1] <= '9') t = true;
}
if (t)
{
string res = "";
string tmp = "";
bool c = false;
int k = 0;
for (int i = 1; i < st.size(); ++i)
{
if (st[i] == 'C') c = true;
if (!c && st[i] >= '0' && st[i] <= '9') tmp += st[i];
else if (c && st[i] >= '0' && st[i] <= '9') k = k * 10 + (st[i] - '0');
}
string ri = "";
vector<int> tt;
bool ces = false;
bool ans = false;
if (k / 26 == 27 && k % 26 == 0) ans = true;
while (k > 26)
{
if (k % 26 == 0) k -= 26, ces = true;
if (!ces)tt.push_back(k % 26), k /= 26;
else if (k % 26 == 0) {
tt.push_back(26);
k /= 26;
}
else if (ces) {
tt.push_back(k % 26);
k /= 26;
}
}
if (k == 26) tt.push_back(26);
else {
while (k > 0 && k < 26)
{
tt.push_back(k % 26);
k /= 26;
}
}
if (!ans)
{
for (int i = tt.size() - 1; i >= 0; --i)
{
if (tt[i] == 0) ri += 'A';
else ri += ('A' + tt[i] - 1);
}
}
else
{
for (int i = 0; i < tt.size(); ++i)
{
if (tt[i] == 0) ri += 'A';
else ri += ('A' + tt[i] - 1);
}
}
res = res + ri + tmp;
cout << res << endl;
}
else {
bool k = true;
string res = "";
string c = "";
string r = "";
int po = 0;
char last = 'a';
for (int i = 0; i < st.size(); ++i)
{
if (k && st[i] >= '0' && st[i] <= '9') k = false, last = st[i - 1];
if (k) c += st[i], ++po;
else r += st[i];
}
int cc = 0;
int bia = po - 1;
for (int i = 0; i < po - 1; ++i)
{
cc += (c[i] - 'A' + 1) * powl(26, bia);
--bia;
}
cc += last - 'A' + 1;
c.erase(c.begin(), c.end());
c += to_string(cc);
res = res + "R" + r + "C" + c;
cout << res << endl;
}
}
return 0;
}