題目連結:
http://codeforces.com/problemset/problem/1/B
題目意思:
有兩種方法表示行和列:RXCY(X,Y為整數)和 xN (x 為大寫字母組成的字串用來表示列數,N表示行數)
給出一種表示形式求出另一種表示形式。
解題思路:
1.先判斷是哪種表示形式,如果是形式RXCY,則第一個字元一定為‘R'且第二個字元一定為數字,並且後面一定有C,如果後面全部是數字,則表示形式為xN;
2.注意轉化成相當於26進位的時候,它是從1開始計數而非0開始計數,則此時要注意從後往前掃描,遇零則改為26,前面退一位,具體細節見代碼。
代碼:
#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#define eps 1e-6#define INF (1<<20)#define PI acos(-1.0)using namespace std;char save[1000100];int ans[1000100];bool judge(char * a){ if(*a=='R'&&*(a+1)>='1'&&*(a+1)<='9') //判斷是否為RXCY型 { for(int i=2;a[i];i++) if(a[i]=='C') return true; return false; } return false;}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%s",save); if(judge(save)) { int sum1=0,sum2=0,i; for(i=1;save[i]!='C';i++) { sum1=sum1*10+save[i]-'0'; } for(i++;save[i];i++) sum2=sum2*10+save[i]-'0'; i=0; while(sum2) { i++; ans[i]=sum2%26; sum2/=26; } int j=i; for(i=1;i<j;i++) { if(ans[i]==0) //注意是從1開始計數 { ans[i+1]-=1; ans[i]=26; } if(ans[i]<0) { ans[i]+=26; ans[i+1]-=1; } } if(ans[j]==0) //去掉前置零 j--; for(i=j;i>=1;i--) printf("%c",ans[i]+'A'-1); printf("%d\n",sum1); } else { int sum1=0,sum2=0; int i; for(i=0;save[i]<'1'||save[i]>'9';i++) sum2=sum2*26+save[i]-'A'+1; for(;save[i];i++) sum1= sum1*10+save[i]-'0'; printf("R%dC%d\n",sum1,sum2); } } return 0;}