HDU 2137 circumgyrate the string

2698 단어
제목:회전 문자열 인쇄
사고방식: 몇 가지 Trick:
(1) 가로로 친 것은 정격을 해야 한다
(2) 세로로 된 것은 빈칸이 있어야 한다.
(3) 문자를 출력한 후에 빈칸이 나타나지 않는다. (오랫동안 문제를 썰지 않았는데, 이런 문제는 일찍부터 워드에 걸어야 한다. 도구--옵션--모든 빌어먹을 물건을 표시한다)
(4)n은 음수
코드가 엉망이어서 정말 징그럽다. 자신의 코드를 잘 고쳐야 한다.1차원 심플하고 우아해요.
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char str[85];
char ling[85][85];
int n;
int main()
{
//freopen("f.txt","r",stdin);
//freopen("f.out1.txt","w",stdout);
while(~scanf("%s%d",str,&n))
{
    memset(ling,0,sizeof(ling));
    int len=strlen(str);
    int x=len/2;
    int y=len/2;
    ling[x][y]=str[len/2];
    if(n%8==0)
       {
         printf("%s
",str); continue; } else if(n%8==4||n%8==-4) { for(int i=len-1;i>=0;i--) printf("%c",str[i]); printf("
"); continue; } else if(n%8==1||n%8==-7) { for(int i=1;i<=len/2;i++) ling[x-i][y+i]=str[len/2+i]; for(int i=1;i<=len/2;i++) ling[x+i][y-i]=str[len/2-i]; } else if(n%8==2||n%8==-6) { for(int i=1;i<=len/2;i++) ling[x-i][y]=str[len/2+i]; for(int i=1;i<=len/2;i++) ling[x+i][y]=str[len/2-i]; } else if(n%8==3||n%8==-5) { for(int i=1;i<=len/2;i++) ling[x-i][y-i]=str[len/2+i]; for(int i=1;i<=len/2;i++) ling[x+i][y+i]=str[len/2-i]; } else if(n%8==5||n%8==-3) { for(int i=1;i<=len/2;i++) ling[x+i][y-i]=str[len/2+i]; for(int i=1;i<=len/2;i++) ling[x-i][y+i]=str[len/2-i]; } else if(n%8==6||n%8==-2) { for(int i=1;i<=len/2;i++) ling[x+i][y]=str[len/2+i]; for(int i=1;i<=len/2;i++) ling[x-i][y]=str[len/2-i]; } else if(n%8==7||n%8==-1) { for(int i=1;i<=len/2;i++) ling[x+i][y+i]=str[len/2+i]; for(int i=1;i<=len/2;i++) ling[x-i][y-i]=str[len/2-i]; } for(int i=0;i<len;i++) { for(int j=0;j<len;j++) { if(ling[i][j]) { printf("%c",ling[i][j]); break;// trick } else printf(" "); } printf("
"); } } //system("Pause"); return 0;}

좋은 웹페이지 즐겨찾기