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,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 }
这道题直接把我的心态搞炸了!~!