1. 程式人生 > >計蒜客 矩陣反轉

計蒜客 矩陣反轉

題目描述

  • 24.22%
  • 1000ms
  • 65536K

曉萌最近在做一個翻轉圖片的應用,你可能也知道,圖片其實是由一個個的點組成的。於是,曉萌想先做一個可以翻轉矩陣的程式,來解決他問題的核心部分。

輸入格式

輸入第一行包括由空格分開的整數 M,N,T(0 < N,M < 200),T 的值為 0或 1。其中 M 和 N分別表示待處理矩陣的行數與列數,T 為 00時表示左右翻轉,為 1 時表示上下翻轉。

之後的 M 行,每行包括由空格分隔的 N 個整數,依次為輸入矩陣的每一行的資料。

輸出格式

輸出包括 MM行 NN列,每個數字之間用一個空格分隔,每一行行末均有一個空格,表示的是按照要求翻轉後的矩陣。

樣例輸入

4 4 1
1 2 3 4
5 6 7 8
9 0 1 2
3 4 5 6

樣例輸出

3 4 5 6 
9 0 1 2 
5 6 7 8 
1 2 3 4 

 AC程式碼:

#include<bits/stdc++.h>
#define n 205
using namespace std;
int main()
{
    int a[n][n],s,M,N,T;
    cin>>M>>N>>T;
    for(int i=1;i<=M;i++)
    {
        for(int j=1;j<=N;j++)
            cin>>a[i][j];
    }
    if(T==0)
    {
        for(int i=1,j=N;i<=N/2&&j>=N/2;i++,j--)
        //注意控制條件,如果為i<=N&&j<=N,首先j的條件不對
        //為一直滿足,其次應均為N/2,不然相當於翻轉再翻轉為原樣
        {
            for(int k=1;k<=M;k++)
            {
                s=a[k][i];
                a[k][i]=a[k][j];
                a[k][j]=s;
            }
        }
    }
    if(T==1)
    {
        for(int i=1,j=M;i<=M/2&&j>=M/2;i++,j--)
        {
            for(int k=1;k<=N;k++)
            {
                s=a[i][k];
                a[i][k]=a[j][k];
                a[j][k]=s;
            }
        }
    }
    for(int i=1;i<=M;i++)
    {
        for(int j=1;j<=N;j++)
        {
            cout<<a[i][j]<<' ';
        }
        cout<<endl;
    }
    return 0;
}

思路註釋:

1、迴圈巢狀,外層控制行列的向中進行,裡層控制將這兩行或列的元素交換。

2、注意控制條件,如果為i<=N&&j<=N,首先j的條件不對為一直滿足,其次應均為N/2,不然相當於翻轉再翻轉為原樣。