HDU 2137 circumgyrate the string

题意:打印出旋转字符串

思路:有几个trick:

(1)横着打出来的要顶格

(2)竖着打出来的要有空格在前面

(3)打印出字符之后没有空格出现了(好久没切过题了,这样的题目老早要挂在word哪里工具--选项--显示所有的该死的东西的)

(4)n为负数


代码胡乱码,真心恶心,自己的代码是要好好修一下了.一维的简单更优雅.


#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\n",str);
         continue;       
       }
    else if(n%8==4||n%8==-4)
       {
          for(int i=len-1;i>=0;i--)
            printf("%c",str[i]);
          printf("\n");
          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("\n");
    }
         
                             
}
//system("Pause");
return 0;}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值