輸入格式:原題單測資,本參考改為多測資,讀至EOF, 每筆測資說明如下:第一行有三個介於 1 與 10 之間的正整數 R, C, M 。 接下來有 R 行(line)是矩陣 B 的內容 ,每一行(line)都包含 C 個正整數 ,其中的第 i 行第 j 個數字代表矩陣 Bij 的值 。 在矩陣內容後的一行有 M 個整數, 表示對矩陣 A 進行的操作 。 第 k 個整數 mk 代表第 k 個操作,如果 mk = 0 則代表旋轉,mk = 1 代表翻轉。同一行的數字之間都是以一個空白間格,且矩陣內容為 0~9 的整數。
輸出格式:兩筆輸出之間空一列,每筆輸出包含兩個部分。第一個部分有一行,包含兩個正整數 R' 和 C',以一個空白隔開,分別代表矩陣 A 的列數和行數。接下來有 R' 行,每一行都包含 C' 個正整數,且每一行的整數之間以一個空白隔開,其中第 i 行的第 j 個數字代表矩陣 Aij 的值。每一行的最後一個數字後並無空白
範例輸入:
3 2 3
1 1
3 1
1 2
1 0 0
3 2 2
3 3
2 1
1 2
0 1
範例輸出:
3 2
1 1
1 3
2 1
2 3
2 1 3
1 2 3
參考程式碼:
// apcs-2 矩陣轉換
#include <iostream>
#include <vector>
using namespace std;
const int MaxN = 10;
int a[2][MaxN][MaxN];
int rc[2]; //列高、行寬
void rev0(int s,int w) //逆旋轉
{
int r = rc[w], c=rc[1-w];
int i,j;
for(i=0; i<r; ++i)
for(j=0; j<c; ++j)
a[1-s][c-1-j][i] = a[s][i][j];
}
void rev1(int s,int w) //逆翻轉
{
int r = rc[w], c=rc[1-w];
int i,j;
for(i=0; i<r; ++i)
for(j=0; j<c; ++j)
a[1-s][r-1-i][j] = a[s][i][j];
}
void print(int s, int w) //印矩陣
{
int r = rc[w], c=rc[1-w];
int i,j;
cout << r <<' '<< c << endl;
for(i=0; i<r; ++i)
{
cout << a[s][i][0];
for(j=1; j<c; ++j)
cout <<' ' << a[s][i][j];
cout << endl;
}
}
int main(void)
{
int i,j ,k, r,c , m;
bool first=true;
while(cin >> r >> c >> m )
{
rc[0] = r ; rc[1] = c;
for(i=0; i<r ; ++i)
for(j=0; j<c; ++j)
cin >> a[0][i][j];
int s=0 , w=0;
// print(s,w); // 測試用印出
int d[MaxN];
for(i=0; i<m; ++i) cin >> d[i];
for(i=m-1; i>=0; --i)
{
if(d[i]==0)
{
rev0(s, w); // 旋轉
w=1-w;
}
else rev1(s,w); // 翻轉
s=1-s;
// print(s,w); // 測試用印出
}
if(first) first=false; else cout << endl;
print(s,w);
}
return 0;
}
0 意見:
張貼留言