2016年9月13日 星期二

APCS 105年3月題2-矩陣轉換(C++參考)

APCS Y16M3-Q2 -矩陣轉換  問題描述

輸入格式原題單測資,本參考改為多測資,讀至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 意見:

張貼留言