题目改编于某国外OJ中一题。当时一眼看上去就觉得很水,没仔细想就敲,结果Wrong Answer好多次。Bella把题目简化后放到这里,目的是强调一下细心。
长度为1的字符串有26个,长度为2的有26*26个……因此我们首先可以确定列号对应的字符串长度。然后就是26进制的数字转化了,组合方法也好暴力转化也好,都需要想清楚边界全A和全Z的情况。
另卡了两个小Trick,就是两个R两个C这种单元格算做不存在的,并且题目中有说行号列号都从1开始,0是不存在的。(Bella很坏吧~) 特判之后,主要要解决的就是进制转化问题,A~Z共有26个,很容易想到这是一个26进制,但是如果直接mod26的话肯定会错的!因为题目上说数字是从1开始的,想一想平常的10进制是0~9的,类比一下26进制应该是0~25的,那么如果从数字1开始的话肯定要多算一个,所以要减去1,具体过程看代码。
代码: #include<iostream> #include<cstdio> #include<cstring> #include<iostream> using namespace std; int m,n; void pt(int x) { x=x-1; int t=x&; x=x/26; if(x) pt(x); putchar('A'+t); return; } int main() { freopen("excel.in","r",stdin); freopen("excel.out","w",stdout); scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) { char a[3],b[3]; int a1,b1; scanf("%s%d%s%d",a,&a1,b,&b1); if(a[0]!='R') swap(a1,b1); if(a1>m||a1<1||b1>m||b1<1||a[0]==b[0]) {printf("%d\n",-1);continue;} printf("%d ",a1); pt(b1); printf("\n"); } return 0; }