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;
}
有几个问题:
(1)字符转二进制的时候,没有处理空格
(2)读取数据的时候,用cin读取会丢失空格,题目要求包含大写字母和空格
(3)处理螺旋的时候,逻辑有点问题,具体原因没找出来,但是有测试用例会不通过,我给你简化修改了一下。
运行结果:
代码:
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
void A_er(char a,char s[100]){ //定义函数将大写字母转换成二进制,以字符串形式
if(a==' ')
{
for(int i=0;i<5;i++)
s[i] = '0';
return;
}
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 len = 0;
int R=0,C=0;
char s[410]={0},b[600][30]={0};
int i=0,l=0,L,I=0;
while(1)
{
s[len] = getchar();
if(s[len]=='\n' || s[len]==EOF)
{
s[len] = 0;
break;
}else
len++;
}
i=0;
while(s[i]!=' ')
{
R = R*10 + s[i]-'0';
i++;
}
i++; //跳过空格
while(s[i]!=' ')
{
C = C*10 + s[i]-'0';
i++;
}
i++;//跳过空格
for(;i<len;i++,l++){
A_er(s[i],b[l]); //将二进制分别填补到二维数组b中
}
for(i=0;i<R*C;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';
}
}
int t =0;
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
{
i = 0;
while(i<R*C)
{
//最上一行
for(int j=t;i<R*C && j<C-t;j++)
{
b[t][j] = s[i++];
}
//最右侧列
for(int j= t+1;i<R*C && j < R-t;j++)
{
b[j][C-t-1] = s[i++];
}
//最下层行
for(int j = C-t-2;i<R*C && j>=t;j--)
{
b[R-t-1][j] = s[i++];
}
//最左侧列
for(int j=R-t-2;i<R*C && j>t;j--)
{
b[j][t] = s[i++];
}
t++;
}
}
for(i=0;i<R;i++){ //最后输出b
for(l=0;l<C;l++){
cout<<b[i][l];
}
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!