https://www.nowcoder.com/acm/contest/90/G
题意:给你个n*m的矩阵(只含三种字符‘+’、‘-’、‘|’),在给你个字符串s只含有'L'和’R‘(L表示左旋转,R表示右旋转),按照此字符串进行旋转,输出最后的矩阵的行和列以及旋转后的矩阵!
分析:就是一个模拟矩阵旋转来求解,值得注意的是我们其实只需要考虑几种情况就可以的,我们想想左转一次再右转一次相当于没有旋转,我们就可以先处理字符串s
注意:
左旋即逆时针旋转,右旋即顺时针旋转 -通过一次左旋或右旋会变成| |通过一次左旋或右旋会变成-
1 #include2 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 else118 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 else140 {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 #include2 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 else113 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 else135 PrintF(n,m,0);136 }137 puts("");138 }139 return 0;140 }
这道题直接把我的心态搞炸了!~!