b266: 矩陣翻轉(APCS官網例題)

https://zerojudge.tw/ShowProblem?problemid=b266


APCS首頁的例題

範例輸入:

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;
}

results matching ""

    No results matching ""