g題卡片帶師

西北吳子發表於2020-12-28

本次森崗杯的G題
我打了一個多小時,終於ac了;
吐了
題目描述
桌上有一張卡片,卡片是一個N * N的網格,每個網格正反兩面都包含一個整數。開始卡片被正面朝上放在桌上,請你判斷在執行
下列若干次操作之後卡片中網格的數字分佈:
操作1:1 x y val 表示將第x行,第y列數字修改為val,只修改當前正面朝上的元素。(1 <= x, y <= n)
操作2:2 x y 將卡片第x行和第y行交換。(x, i) <–> (y, i)其中(1 <= i <= n)。(1 <= x, y <= n)
操作3:3 x y 將卡片第x列和第x列交換。(i, x) <–> (i, y)其中(1 <= i <= n)。(1 <= x, y <= n)
操作4:4 將卡片翻轉,正面變反面,反面就會變成正面。
操作5:5 將卡片順時針旋轉90度。
操作6:6 將卡片順時針旋轉180度。
操作7:7 將卡片順時針旋轉270度。
注意:每個網格正反兩面都是一個整體,在交換,旋轉過程中其背面元素是跟著正面元素改變位置的。
輸入描述:
輸入第一行包含兩個整數n, m。表示卡片網格大小和操作次數。
然後跟n行,每行n個整數,表示卡片的正面n * n網格
然後跟n行,每行n個整數,表示卡片的反面n * n網格。
然後跟m行,每行一個操作指令。
輸出描述:
在m個操作指令執行之後,輸出答案。
輸出前n行,每行n個整數,表示卡片的正面。
然後再輸出n行,每行n個整數,表示卡片的反面。
示例1
輸入
複製
3 7
1 2 3
4 5 6
7 8 9
7 8 9
4 5 6
1 2 3
1 1 3 0
2 1 3
3 2 3
4
5
6
7
輸出
複製
8 9 7
5 6 4
2 3 1
2 0 1
5 6 4
8 9 7
說明
正面 反面
1 2 3 7 8 9
4 5 6 4 5 6
7 8 9 1 2 3
在執行1 1 3 0之後:
正面 反面
1 2 0 7 8 9
4 5 6 4 5 6
7 8 9 1 2 3
在執行2 1 3之後:
7 8 9 1 2 3
4 5 6 4 5 6
1 2 0 7 8 9
在執行3 2 3之後:
7 9 8 1 3 2
4 6 5 4 6 5
1 0 2 7 9 8
在執行4之後:
1 3 2 7 9 8
4 6 5 4 6 5
7 9 8 1 0 2
在執行5之後:
7 4 1 1 4 7
9 6 3 0 6 9
8 5 2 2 5 8
在執行6之後:
2 5 8 8 5 2
3 6 9 9 6 0
1 4 7 7 4 1
在執行7之後:
8 9 7 2 0 1
5 6 4 5 6 4
2 3 1 8 9 7
備註:
1 <= n, m, val <= 100
程式碼如下

#include<iostream>
#include<algorithm>
using namespace std;
const int N=105;
int n,m;
int a[N][N];//正面
int b[N][N];//反面
//方案一
void fan_1(int x,int y,int val){
    a[x][y]=val;
}
//方案二
void fan_2(int x,int y){
    int c[N];int d[N];
    for(int i=0;i<n;i++) c[i]=a[x][i],d[i]=b[x][i];
    for(int i=0;i<n;i++) a[x][i]=a[y][i],b[x][i]=b[y][i];
    for(int i=0;i<n;i++) a[y][i]=c[i],b[y][i]=d[i];
}
//方案三
void fan_3(int x,int y){
    int c[N];int d[N];
    for(int i=0;i<n;i++) c[i]=a[i][x],d[i]=b[i][x];
    for(int i=0;i<n;i++) a[i][x]=a[i][y],b[i][x]=b[i][y];
    for(int i=0;i<n;i++) a[i][y]=c[i],b[i][y]=d[i];
}
void fan_4(){
    int c[N][N];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            c[i][j]=a[i][j];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            a[i][j]=b[i][j];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            b[i][j]=c[i][j];
}
//方案五
void fan_5(){
    int c[N][N];int d[N][N];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            c[i][j]=a[n-j-1][i];
            d[i][j]=b[n-j-1][i];
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            a[i][j]=c[i][j];
            b[i][j]=d[i][j];
        }
}
//方案六
void fan_6(){
    int c[N][N];int d[N][N];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            c[i][j]=a[n-i-1][n-j-1];
            d[i][j]=b[n-i-1][n-j-1];
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            a[i][j]=c[i][j];
            b[i][j]=d[i][j];
        }
}
//方案七
void fan_7(){
    int c[N][N];int d[N][N];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            c[i][j]=a[j][n-i-1];
            d[i][j]=b[j][n-i-1];
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            a[i][j]=c[i][j];
            b[i][j]=d[i][j];
        }
}
int main(){
    cin>>n>>m;
    //輸入正反數
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>a[i][j];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>b[i][j];
    //執行操作
    for(int i=0;i<m;i++){
        int f_a;
        cin>>f_a;//執行方案輸入
        //到底是用swith還是級聯,我選擇swith;
        int x,y,val;
        switch(f_a){
        case 1:
            cin>>x>>y>>val;fan_1(x-1,y-1,val);break;
        case 2:
            cin>>x>>y;fan_2(x-1,y-1);break;
        case 3:
            cin>>x>>y;fan_3(x-1,y-1);break;
        case 4:
            fan_4();break;
        case 5:
            fan_5();break;
        case 6:
            fan_6();break;
        case 7:
            fan_7();break;
        }
    }
    //輸出正面
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cout<<a[i][j]<<(j!=n-1?" ":"\n");
    //輸出反面
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cout<<b[i][j]<<(j!=n-1?" ":"\n");
    return 0;
}

一個萌新的無奈,只會用這種笨辦法0.0
還不是會長非要叫我打
我才懶得打

相關文章