Description
給定m行n列的映像各像素點灰階值,對其依次進行一系列操作後,求最終映像。
其中,可能的操作及對應字元有如下四種:
A:順時針旋轉90度;
B:逆時針旋轉90度;
C:左右翻轉;
D:上下翻轉。 Input
多組輸入,至EOF結束。
第一行包含兩個正整數m和n,表示映像的行數和列數,中間用單個空格隔開。1 <= m <= 100, 1 <= n <= 100。
接下來m行,每行n個整數,表示映像中每個像素點的灰階值,相鄰兩個數之間用單個空格隔開。灰階值範圍在0到255之間。
接下來一行,包含由A、B、C、D組成的字串s,表示需要按順序執行的操作序列。s的長度在1到100之間。 Output
每組m'行,每行包含n'個整數,為最終映像各像素點的灰階值。其中m'為最終映像的行數,n'為最終映像的列數。相鄰兩個整數之間用單個空格隔開。 Sample Input 2 310 0 10100 100 10AC Sample Output
10 1000 10010 10
思路:
定義兩個二維數組,一個用來操作,一個用來儲存變化後的數組,注意每次操作時清空無用數組,防止發生資料重疊。
情況A的轉置比較難想,需要用q1[j][m-1-i]=q[i][j];這樣的代碼來處理。
情況B可以由A操作三次完成。簡化了操作。
情況CD略。
其中第一次提交忘了聲明ACD。然而codeblocks並沒有提醒。血崩。
代碼:
#include <stdio.h>#include <stdlib.h>#include <string.h>int m,n;char s[100];int q[100][100]= {0};int q1[100][100]= {0};int i,j,k;int main(){ void A(); void C(); void D();//不要忘了聲明。。。。 while(scanf("%d%d",&m,&n)!=EOF) { for(i=0; i<m; i++) { for(j=0; j<n; j++) scanf("%d",&q[i][j]); } scanf("%s",s); for(k=0; k<strlen(s); k++) { if(s[k]=='A') { A(); } if(s[k]=='B') { A(); A(); A(); } if(s[k]=='C') { C(); } if(s[k]=='D') { D(); } } for(i=0; i<m; i++) { for(j=0; j<n; j++) { if(j==0) printf("%d",q[i][j]); else printf(" %d",q[i][j]); } printf("\n"); } } return 0;}void A(){ memset(q1,0,sizeof(q1)); for(i=0; i<m; i++) { for(j=0; j<n; j++) { q1[j][m-1-i]=q[i][j]; } } int temp=m; m=n; n=temp; memset(q,0,sizeof(q)); for(i=0; i<m; i++) for(j=0; j<n; j++) q[i][j]=q1[i][j];}void C(){ memset(q1,0,sizeof(q1)); for (i=0; i<m; i++) { for (j=0; j<n; j++) { q1[i][j]=q[i][n-j-1]; } } memset(q,0,sizeof(q)); for (i=0; i<m; i++) for (j=0; j<n; j++) q[i][j]=q1[i][j];}void D(){ memset(q1,0,sizeof(q1)); for (i=0; i<m; i++) { for (j=0; j<n; j++) { q1[i][j]=q[m-1-i][j]; } } memset(q,0,sizeof(q)); for (i=0; i<m; i++) for (j=0; j<n; j++) q[i][j]=q1[i][j];}