列表

详情


MT2. 棋子翻转

描述

在 4x4 的棋盘上摆满了黑白棋子,黑白两色棋子的位置和数目随机,其中0代表白色,1代表黑色;左上角坐标为 (1,1) ,右下角坐标为 (4,4) 。
现在依次有一些翻转操作,要对以给定翻转坐标(x,y)(也即第x行第y列)为中心的上下左右四个棋子的颜色进行翻转。
给定两个数组 A 和 f ,分别代表 初始棋盘 和 哪些要进行翻转的位置(x,y) 请返回经过所有翻转操作后的棋盘。

例如输入[[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]],[[2,2],[3,3],[4,4]]时,初始键盘如下图所示:
对应的输出为[[0,1,1,1],[0,0,1,0],[0,1,1,0],[0,0,1,0]],如下图所示:

示例1

输入:

[[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]],[[2,2],[3,3],[4,4]]

输出:

[[0,1,1,1],[0,0,1,0],[0,1,1,0],[0,0,1,0]]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2021-12-20

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型vector<vector<>> 
     * @param f int整型vector<vector<>> 
     * @return int整型vector<vector<>>
     */
    set<vector<int>> set;
    
    void insert(vector<int> pos, int m, int n){
        if(pos[0] >= 1 && pos[0] <= m)
            if(pos[1] >= 1 && pos[1] <= n){
                if(set.find(pos) == set.end())
                    set.insert(pos);
                else
                    set.erase(pos);
            }

    }
    
    vector<vector<int> > flipChess(vector<vector<int> >& A, vector<vector<int> >& f) {
        // write code here
        int m = A.size();
        int n = A[0].size();
        for(auto& pos : f){
            vector<int> dm = {0, 0, 1, -1};
            vector<int> dn = {1, -1, 0, 0};
            for(int i = 0; i < 4; i++){
                vector<int> temp(pos);
                temp[0] += dm[i];
                temp[1] += dn[i];
                insert(temp, m, n);
            }
        }
        
        for(auto& pos : set){
            int x = pos[0] - 1;
            int y = pos[1] - 1;
            A[x][y] = 1 - A[x][y];
        }
        
        return A;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-03-26

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型vector<vector<>> 
     * @param f int整型vector<vector<>> 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > flipChess(vector<vector<int> >& A, vector<vector<int> >& f) {
        // write code here
        for(int i=0;i<f.size();i++){
            int x=f[i][0]-1;
            int y=f[i][1]-1;
            tran(A,x,y);
        }
        return A;
    }
    void tran(vector<vector<int>>&a,int x,int y)
    {
        if(x-1>=0&&y>=0&&x-1<4&&y<4){
            a[x-1][y]=!a[x-1][y];
            }
        if(x+1>=0&&y>=0&&x+1<4&&y<4){
            a[x+1][y]=!a[x+1][y];
        }
        if(x>=0&&y-1>=0&&x<4&&y-1<4){
            a[x][y-1]=!a[x][y-1];
        } 
        if(x>=0&&y+1>=0&&x<4&&y+1<4)
            a[x][y+1]=!a[x][y+1];
        }
        
    
};

C++ 解法, 执行用时: 3ms, 内存消耗: 416KB, 提交时间: 2022-03-26

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型vector<vector<>> 
     * @param f int整型vector<vector<>> 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > flipChess(vector<vector<int> >& A, vector<vector<int> >& f) {
        // write code here
        for (int i = 0; i < f.size(); i++) {
            int x = f[i][0] - 1;
            int y = f[i][1] - 1;
            // 上
            if (x - 1 >= 0) A[x-1][y] ^= 1;
            // 下
            if (x + 1 < 4) A[x+1][y] ^= 1;
            // 左
            if (y - 1 >= 0) A[x][y-1] ^= 1;
            // 右
            if (y + 1 < 4) A[x][y+1] ^= 1;
        }
        return A;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-03-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型vector<vector<>> 
     * @param f int整型vector<vector<>> 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > flipChess(vector<vector<int> >& A, vector<vector<int> >& f) {
        // write code here
        for(int i = 0; i < f.size(); i++){
            dfs(A, f[i][0] - 1, f[i][1] - 1);
        }
        return A;
    }
    
    void dfs(vector<vector<int> >& A, int i, int j){
        if(i - 1 >= 0)
            A[i - 1][j] = A[i - 1][j] == 0? 1: 0;
        if(i + 1 < A.size())
            A[i + 1][j] = A[i + 1][j] == 0? 1: 0;
        if(j - 1 >= 0)
            A[i][j - 1] = A[i][j - 1] == 0? 1: 0;
        if(j + 1 < A[0].size())
            A[i][j + 1] = A[i][j + 1] == 0? 1: 0;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2021-12-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型vector<vector<>> 
     * @param f int整型vector<vector<>> 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > flipChess(vector<vector<int> >& A, vector<vector<int> >& f) {
        // write code here
        for(vector<int>& v:f){
            v[0]--; v[1]--;
            if(v[0]-1>=0){
                cout<<A[v[0]-1][v[1]]<<',';
                A[v[0]-1][v[1]]=A[v[0]-1][v[1]]==0?1:0;
                cout<<A[v[0]-1][v[1]]<<' ';
            }
            if(v[0]+1<=3){
                cout<<A[v[0]+1][v[1]]<<',';
                A[v[0]+1][v[1]]=A[v[0]+1][v[1]]==0?1:0;
                cout<<A[v[0]+1][v[1]]<<' ';
            }
            if(v[1]-1>=0){
                cout<<A[v[0]][v[1]-1]<<',';
                A[v[0]][v[1]-1]=A[v[0]][v[1]-1]==0?1:0;
                cout<<A[v[0]][v[1]-1]<<' ';
            }
            if(v[1]+1<=3){
                cout<< A[v[0]][v[1]+1]<<',';
                A[v[0]][v[1]+1]=A[v[0]][v[1]+1]==0?1:0;
                cout<< A[v[0]][v[1]+1]<<' ';
            }
            cout<<endl;
        }
        return A;
    }
};

上一题