b266: 矩陣翻轉(APCS官網例題)
https://zerojudge.tw/ShowProblem?problemid=b266
範例輸入:
3 2 3 <- 3列 2行 3個翻轉或旋轉指令
1 1 <- 以下3列是矩陣
3 1
1 2
1 0 0 <- 0是旋轉(順時針) 1是翻轉(上下翻轉)
3 2 2
3 3
2 1
1 2
0 1
範例輸出:
3 2 <- 下面矩陣的row跟col
1 1 <- 矩陣資料
1 3
2 1
2 3 <- 下面矩陣的row跟col
2 1 3 <- 矩陣資料
1 2 3
範例解釋
輸入資訊如下
3 2 3
1 1
3 1
1 2
1 0 0
代表結果的矩陣B是這樣
1 1
3 1
1 2
B是A矩陣經過1(上下顛倒)->0(順時針旋轉)->0(順時針旋轉)
所以要求出A必須將 1 0 0 給回朔
#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;
}
Allen註解版
#include <iostream>
using namespace std;
const int MaxN = 10;
int data[MaxN][MaxN];
int cmd[MaxN];
int row, col;
void reverse_cmd0() //逆旋轉(逆時針旋轉)
{
int i, j;
int newData[MaxN][MaxN];
//逆時針旋轉
for (i = 0; i < row; i++){
for (j = 0; j < col; j++){
newData[j][i] = data[i][col - j -1];
}
}
//把row與col交換
int temp = row;
row = col;
col = temp;
//把新的陣列回傳給data
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
data[i][j] = newData[i][j];
}
void reverse_cmd1() //逆翻轉(翻轉逆跟不膩都是一樣的)
{
int i, j;
int newData[MaxN][MaxN];
//上下顛倒
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
newData[i][j] = data[row - i - 1][j];
//把新的陣列回傳給data
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
data[i][j] = newData[i][j];
}
void print() //印矩陣
{
int i, j;
cout << row << ' ' << col << endl;
for (i = 0; i < row; ++i) {
for (j = 0; j < col; ++j)
cout<< data[i][j] <<" ";
cout << endl;
}
}
int main(void)
{
int i, j, m;
while (cin >> row >> col >> m) {
//依序輸入所有矩陣的資料
for (i = 0; i < row; ++i)
for (j = 0; j < col; ++j)
cin >> data[i][j];
//輸入操作矩陣的指令(0或1)
for (i = 0; i < m; ++i) cin >> cmd[i];
//從最後一個指令開始解析,因為我們要讓整個矩陣變成原矩陣
for (i = m - 1; i >= 0; --i) {
if (cmd[i] == 0) {
reverse_cmd0(); // 逆時針旋轉
}
else{
reverse_cmd1(); // 翻轉
}
}
print();
cout<<endl;
}
return 0;
}