旋转矩阵(模拟)

https://www.nowcoder.com/acm/contest/90/G

题意:给你个n*m的矩阵(只含三种字符‘+’、‘-’、‘|’),在给你个字符串s只含有'L'和’R‘(L表示左旋转,R表示右旋转),按照此字符串进行旋转,输出最后的矩阵的行和列以及旋转后的矩阵!

分析:就是一个模拟矩阵旋转来求解,值得注意的是我们其实只需要考虑几种情况就可以的,我们想想左转一次再右转一次相当于没有旋转,我们就可以先处理字符串s

注意:

左旋即逆时针旋转,右旋即顺时针旋转
-通过一次左旋或右旋会变成|
|通过一次左旋或右旋会变成-


  1 #include<bits/stdc++.h>
  2 
  3 using namespace std;
  4 const int maxn=1005;
  5 char s[maxn];
  6 int n,m;
  7 char a[50][50];
  8 
  9 void R_x(int n,int m)
 10 {
 11     char b[50];
 12     char c[50][50];
 13     for(int j=1; j<=m; j++)
 14     {
 15         for(int i=n; i>=1; i--)
 16         {
 17             b[n-i+1]=a[i][j];
 18         }
 19         for(int i=1;i<=n;i++)
 20         {
 21             c[j][i]=b[i];
 22         }
 23     }
 24     for(int i=1; i<=m; i++)
 25         for(int j=1; j<=n; j++)
 26             a[i][j]=c[i][j];
 27 }
 28 void L_x(int n,int m)
 29 {
 30     char b[50];
 31     char c[50][50];
 32     for(int i=1;i<=n;i++)
 33     {
 34         for(int j=m;j>=1;j--)
 35         {
 36             b[m-j+1]=a[i][j];
 37         }
 38         for(int j=1;j<=m;j++)
 39         {
 40             c[j][i]=b[j];
 41         }
 42     }
 43 
 44     for(int i=1;i<=n;i++)
 45         for(int j=1;j<=m;j++)
 46             a[j][i]=c[j][i];
 47 }
 48 void PrintF(int r,int c,int flag)
 49 {
 50     printf("%d %d\n",r,c);
 51     if(flag)
 52         for(int i=1; i<=r; i++)
 53         {
 54             for(int j=1; j<=c; j++)
 55             {
 56                 if(a[i][j]=='-')
 57                     printf("|");
 58                 else if(a[i][j]=='|')
 59                     printf("-");
 60                 else
 61                     printf("%c",a[i][j]);
 62             }
 63             puts("");
 64         }
 65     else
 66         for(int i=1; i<=r; i++)
 67         {
 68             for(int j=1; j<=c; j++)
 69             {
 70                 printf("%c",a[i][j]);
 71             }
 72             puts("");
 73         }
 74 }
 75 
 76 int main()
 77 {
 78     int t;
 79     scanf("%d",&t);
 80     while(t--)
 81     {
 82         scanf("%d %d",&n,&m);
 83         for(int i=1; i<=n; i++)
 84         {
 85             scanf("%s",a[i]+1);
 86         }
 87         scanf("%s",s);
 88         int len=strlen(s);
 89         int l=0;
 90         int r=0;
 91         for(int i=0; i<=len; i++)
 92         {
 93             if(s[i]=='L')
 94                 l++;
 95             if(s[i]=='R')
 96                 r++;
 97         }
 98         if(l>r)
 99         {
100             l=(l-r)%4;
101             if(l==3)
102             {
103                 R_x(n,m);
104                 PrintF(m,n,1);
105             }
106             else if(l==2)
107             {
108                 R_x(n,m);
109                 R_x(m,n);
110                 PrintF(n,m,0);
111             }
112             else if(l==1)
113             {
114                 L_x(n,m);
115                 PrintF(m,n,1);
116             }
117             else
118                 PrintF(n,m,0);
119         }
120         else if(r>l)
121         {
122             r=(r-l)%4;
123             if(r==3)
124             {
125                 L_x(n,m);
126                 PrintF(m,n,1);
127             }
128             else if(r==2)
129             {
130                 R_x(n,m);
131                 R_x(m,n);
132                 PrintF(n,m,0);
133             }
134             else if(r==1)
135             {
136                 R_x(n,m);
137                 PrintF(m,n,1);
138             }
139             else
140             {
141                 PrintF(n,m,0);
142             }
143         }
144         else if(l==r)
145         {
146             printf("%d %d\n",n,m);
147             for(int i=1; i<=n; i++)
148                 printf("%s\n",a[i]+1);
149         }
150             puts("");
151     }
152     return 0;
153 }
AC代码

比赛的时候尽然没AC,WA了无数次,去吃了饭回来重新再来看了看这道题,尽然发现了自己的错误是自己想错了一点:我以为s的长度为偶数尽然不旋转,我也不知道当时是为什么怎么想的,我记得我当时想的是L,R的数目一样才不旋转,结果写成了长度为偶数不旋转!~!~脑壳瓦特了!~

还是把WA了无数次的代码贴出来吧,主要为了让自己更清楚的知道自己的错误!~

 

 

 

 

  1 #include<bits/stdc++.h>
  2  
  3 using namespace std;
  4 const int maxn=1005;
  5 char s[maxn];
  6 int n,m;
  7 char a[50][50];
  8  
  9 void R_x(int n,int m)
 10 {
 11     char b[50];
 12     char c[50][50];
 13     for(int j=1; j<=m; j++)
 14     {
 15         for(int i=n; i>=1; i--)
 16             b[n-i+1]=a[i][j];
 17         for(int i=1;i<=n;i++)
 18             c[j][i]=b[i];
 19     }
 20     for(int i=1; i<=m; i++)
 21         for(int j=1; j<=n; j++)
 22             a[i][j]=c[i][j];
 23 }
 24 void L_x(int n,int m)
 25 {
 26     char b[50];
 27     char c[50][50];
 28     for(int i=1;i<=n;i++)
 29     {
 30         for(int j=m;j>=1;j--)
 31             b[m-j+1]=a[i][j];
 32         for(int j=1;j<=m;j++)
 33             c[j][i]=b[j];
 34     }
 35     for(int i=1;i<=n;i++)
 36         for(int j=1;j<=m;j++)
 37             a[j][i]=c[j][i];
 38 }
 39 void PrintF(int r,int c,int flag)
 40 {
 41     printf("%d %d\n",r,c);
 42     if(flag)
 43         for(int i=1; i<=r; i++)
 44         {
 45             for(int j=1; j<=c; j++)
 46             {
 47                 if(a[i][j]=='-')
 48                     printf("|");
 49                 else if(a[i][j]=='|')
 50                     printf("-");
 51                 else
 52                     printf("%c",a[i][j]);
 53             }
 54             puts("");
 55         }
 56     else
 57         for(int i=1; i<=r; i++)
 58         {
 59             for(int j=1; j<=c; j++)
 60                 printf("%c",a[i][j]);
 61             puts("");
 62         }
 63 }
 64  
 65 int main()
 66 {
 67     int t;
 68     scanf("%d",&t);
 69     while(t--)
 70     {
 71         scanf("%d %d",&n,&m);
 72         for(int i=1; i<=n; i++)
 73             scanf("%s",a[i]+1);
 74         scanf("%s",s);
 75         int len=strlen(s);
 76         if(len%2==0)
 77         {
 78             printf("%d %d\n",n,m);
 79             for(int i=1; i<=n; i++)
 80                 printf("%s\n",a[i]+1);
 81             puts("");
 82             continue;
 83         }
 84         int l=0;
 85         int r=0;
 86         for(int i=0; i<=len; i++)
 87         {
 88             if(s[i]=='L')
 89                 l++;
 90             if(s[i]=='R')
 91                 r++;
 92         }
 93         if(l>r)
 94         {
 95             l=(l-r)%4;
 96             if(l==3)
 97             {
 98                 R_x(n,m);
 99                 PrintF(m,n,1);
100             }
101             else if(l==2)
102             {
103                 R_x(n,m);
104                 R_x(m,n);
105                 PrintF(n,m,0);
106             }
107             else if(l==1)
108             {
109                 L_x(n,m);
110                 PrintF(m,n,1);
111             }
112             else
113                 PrintF(n,m,0);
114         }
115         else if(r>l)
116         {
117             r=(r-l)%4;
118             if(r==3)
119             {
120                 L_x(n,m);
121                 PrintF(m,n,1);
122             }
123             else if(r==2)
124             {
125                 R_x(n,m);
126                 R_x(m,n);
127                 PrintF(n,m,0);
128             }
129             else if(r==1)
130             {
131                 R_x(n,m);
132                 PrintF(m,n,1);
133             }
134             else
135                 PrintF(n,m,0);
136         }
137             puts("");
138     }
139     return 0;
140 }
WA了无数次的代码

这道题直接把我的心态搞炸了!~!

转载于:https://www.cnblogs.com/Y-Meng/p/8640805.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值