OJ 1.8的第25题代码错误不知道怎么修改
题目在http://noi.openjudge.cn/ch0108/25/
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
void A_er(char a,char s[100]){ //定义函数将大写字母转换成二进制,以字符串形式
int t=(a-'A'+1);
s[0]='0'+t/16;
t-=t/16*16;
s[1]='0'+t/8;
t-=t/8*8;
s[2]='0'+t/4;
t-=t/4*4;
s[3]='0'+t/2;
t-=t/2*2;
s[4]='0'+t;
for(int i=5;i<100;i++){ //将余下的位置用0填上
s[i]='0';
}
}
int main(){
int R,C;
cin>>R>>C;
char s[410]={0},b[600][100]={0};
cin>>s; //输入原字符串
int i,l=0,L,I=0;
for(i=0;i<strlen(s);i++,l++){
if(s[i]!=' ') A_er(s[i],b[l]); //将二进制分别填补到二维数组b中
}
for(i=0;i<410;i++){
s[i]='0'; //再一次令s为0字符串
}
for(i=0;i<l;i++){
for(L=0;L<5;L++){
s[I++]=b[i][L]; //把 b中的二进制填到s中
}
}
for(i=0;i<R;i++){
for(L=0;L<C;L++){ //将 b中成员都变为0
b[i][L]='0';
}
}
I=0,i=0,l=0;
int t;
if(R==1){
for(i=0;i<C;i++){ //排除只有一行
cout<<s[i];
}
return 0;
}
else if(C==1){
for(i=0;i<R;i++){ //排除只有一列
cout<<s[i];
}
return 0;
}
else if(min(C,R)%2==0){
for(t=0;t<1.0/2.0*min(C,R);t++){ //偶数时,刚好螺旋min(C,R)/2次,结束
while(l<C-t){
b[i][l++]=s[I++];
}
l--,i++; //l在结束多加了1,所以减掉1, i+1是为了使下次赋值从下行开始
while(i<R-t){
b[i++][l]=s[I++];
}
i--,l--;
while(l>=t){
b[i][l--]=s[I++];
}
l++,i--;
while(i>t){
b[i--][l]=s[I++];
}
i++,l++;
}
}
else{
for(t=0;t<1.0/2.0*min(C,R);t++){ //奇数时,螺旋min(C,R)/2次后还要再补上一行或一列
while(l<C-t){
b[i][l++]=s[I++];
}
l--,i++;
while(i<R-t){
b[i++][l]=s[I++];
}
i--,l--;
while(l>=t){
b[i][l--]=s[I++];
}
l++,i--;
while(i>t){
b[i--][l]=s[I++];
}
i++,l++;
}
for(i=max(C,R)+1-2*(t+1);i>0;i--){ //在最后一圈结束后,还有max(C,R)+1-2*(t+1)个地方没有填上数据
if(C>R){
b[i][l++]=s[I++]; //之前的循环结束后,最后一定停在了b[i][l]的位置
}
if(C<=R){
b[i++][l]=s[I++];
}
}
}
for(i=0;i<R;i++){ //最后输出b
for(l=0;l<C;l++){
cout<<b[i][l];
}
}
return 0;
}