首页 > 试题广场 >

棋子翻转

[编程题]棋子翻转
  • 热度指数:2999 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在 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]]
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
        int sz = f.size();
//         int m = f[0].size();
        int n = A.size();
        for(int i=0; i<sz; i++)
        {
            int k=f[i][0]-1;
            int j=f[i][1]-1;
            if(k>0)
                A[k-1][j] = (A[k-1][j] + 1) % 2;
            if(k+1<n)
                A[k+1][j] = (A[k+1][j] + 1) % 2;
            if(j>0)
                A[k][j-1] = (A[k][j-1] + 1) % 2;
            if(j+1<n)
                A[k][j+1] = (A[k][j+1] + 1) % 2;
        }
        return A;
    }
};

发表于 2022-08-09 11:26:00 回复(0)

判断边界,然后对应翻转即可。

import java.util.*;
public class Solution {
    public int[][] flipChess (int[][] A, int[][] f) {
        for(int i = 0; i < f.length; ++i) {
            f[i][0] = f[i][0] - 1;
            f[i][1] = f[i][1] - 1;
            if(f[i][0] + 1 <= 3)
                A[f[i][0] + 1][f[i][1]] = A[f[i][0] + 1][f[i][1]] == 0 ? 1 : 0;
            if(f[i][0] - 1 >= 0) 
                A[f[i][0] - 1][f[i][1]] = A[f[i][0] - 1][f[i][1]] == 0 ? 1 : 0;
            if(f[i][1] + 1 <= 3) 
                A[f[i][0]][f[i][1] + 1] = A[f[i][0]][f[i][1] + 1] == 0 ? 1 : 0;
            if(f[i][1] - 1 >= 0) 
                A[f[i][0]][f[i][1] - 1] = A[f[i][0]][f[i][1] - 1] == 0 ? 1 : 0;
        }
        return A;
    }
}
发表于 2023-04-20 10:09:29 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型二维数组 
     * @param f int整型二维数组 
     * @return int整型二维数组
     */
    int[] dx = new int[]{-1, 1, 0, 0};
    int[] dy = new int[]{0, 0, -1, 1};
    public int[][] flipChess (int[][] A, int[][] f) {
        // write code here
        for(int i = 0; i < f.length; i++){
            int x = f[i][0] - 1, y = f[i][1] - 1;
            // 4个方向依次反转
            for(int k = 0; k < 4; k++){
                flip(A, x + dx[k], y + dy[k]);
            }
        }
        return A;
    }
    
    private void flip(int[][] map, int x, int y) {
        if(x < 0 || x >= map.length || y < 0 || y >= map[0].length) return;
        map[x][y] = 1 - map[x][y];
    }
}

发表于 2021-12-11 12:13:41 回复(0)
def flipChess(self , A: list[list[int]], f: list[list[int]]) -> list[list[int]]:
    if not f&nbs***bsp;len(f)<1:return A
    row = len(A)
    col = len(A[0])
    def doChange(x,y,row,col,A):
        if x<0&nbs***bsp;x>=row&nbs***bsp;y<0&nbs***bsp;y>=col :
            return
        if A[x][y]==0:
            A[x][y]=1
        else:
            A[x][y]=0
    # 点不转 上下左右转
    for item in f:
        x = item[0]-1
        y = item[1]-1
        doChange(x-1,y,row,col,A)
        doChange(x+1,y,row,col,A)
        doChange(x,y-1,row,col,A)
        doChange(x,y+1,row,col,A)
    return A

编辑于 2023-12-22 11:05:11 回复(0)
import java.util.*;


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

发表于 2023-05-01 11:08:36 回复(0)
package main
import _"fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param A int整型二维数组 
 * @param f int整型二维数组 
 * @return int整型二维数组
*/
func flipChess( A [][]int ,  f [][]int ) [][]int {
    dirs:=[][]int{[]int{0,1},[]int{0,-1},[]int{1,0},[]int{-1,0}}
    for _,fi:=range f{
        for _,dir:=range dirs{
            x,y:=fi[0]+dir[0]-1,fi[1]+dir[1]-1
            if x>=0&&x<4&&y>=0&&y<4{
                if A[x][y]==1{
                    A[x][y]=0
                }else{
                    A[x][y]=1
                }
            }
        }
    }
    return A
}

发表于 2023-03-11 18:18:55 回复(0)
class Solution:
    def flipChess(self , A: List[List[int]], f: List[List[int]]) -> List[List[int]]:
        # write code here
        for coord in f:
            row = coord[0]-1
            col = coord[1]-1
            if row-1 >= 0:
                A[row-1][col] = not(A[row-1][col])
            if row+1 <= 3:
                A[row+1][col] = not(A[row+1][col])
            if col-1 >= 0:
                A[row][col-1] = not(A[row][col-1])
            if col+1 <= 3:
                A[row][col+1] = not(A[row][col+1]) 
        return A  
发表于 2022-09-10 12:27:33 回复(0)
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;
    }
};

发表于 2022-07-19 09:11:45 回复(0)
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
        vector<vector<int>> vc(A.size(),vector<int>(A[0].size(),0));
        for(int i=0;i<f.size();i++)
        {
            flipMatrix(vc, f[i][0]-1, f[i][1]-1);
        }
        for(int i=0;i<A.size();i++)
        {
            for(int j=0;j<A[0].size();j++)
            {
                if(vc[i][j]%2==1)
                {
                    A[i][j]=1-A[i][j];
                }
            }
        }
        return A;
    }
    void flipMatrix(vector<vector<int>>& vc,int x,int y)
    {
        if(x-1>=0)
        {
            vc[x-1][y]++;
        }
        if(y-1>=0)
        {
            vc[x][y-1]++;
        }
        if(x+1<vc.size())
        {
            vc[x+1][y]++;
        }
        if(y+1<vc[0].size())
        {
            vc[x][y+1]++;
        }
    }
};
发表于 2022-06-30 16:38:30 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型二维数组 
     * @param f int整型二维数组 
     * @return int整型二维数组
     */
    public int[][] flipChess (int[][] A, int[][] f) {
        // write code here
        for(int i = 0; i < f.length; i++){
            turn(A, f[i][0] - 1, f[i][1] - 1);
        }
        return A;
    }
    
    private void turn(int[][] A, int i, int j){
        if(i-1 >= 0){
            swap(A,i-1,j);
        }
        if(i+1 < A.length){
            swap(A,i+1,j);
        }
        if(j-1 >= 0){
            swap(A,i,j-1);
        }
        if(j+1 < A.length){
            swap(A,i,j+1);
        }
    }
    
    private void swap(int[][] A, int i, int j){
        // 异或进行翻转
        A[i][j] ^= 1;
    }
}

发表于 2022-03-11 11:51:19 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型vector<vector<>> 
     * @param f int整型vector<vector<>> 
     * @return int整型vector<vector<>>
     */
    int xy[4][2] = {{0,-1},{0,1},{-1,0},{1,0}};
    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, y = f[i][1] - 1;
            for(int j = 0; j < 4; ++j) {
                if((x + xy[j][0]) >= 0 && (x + xy[j][0]) < 4){
                    if((y + xy[j][1]) >=0 && (y + xy[j][1]) < 4) {
                        A[x + xy[j][0]][y + xy[j][1]] ^= 1;
                    }
                }
            }
        }
        return A;
    }
};
发表于 2022-03-05 21:06:57 回复(0)
不确定题目是否有被重复翻转的块
# @param A int整型二维数组 
# @param f int整型二维数组 
# @return int整型二维数组
#
class Solution:
    def flipChess(self , A: List[List[int]], f: List[List[int]]) -> List[List[int]]:
        # write code here
        save = [[0]*len(A) for i in range(0,len(A))]
        for i in f:
            m,n = i[0],i[1]
            m -= 1
            n -= 1
            if(0<=m-1<len(A) and 0<=n<len(A)):
                save[m-1][n] += 1
            if(0<=m+1<len(A) and 0<=n<len(A)):
                save[m+1][n] += 1
            if(0<=m<len(A) and 0<=n-1<len(A)):
                save[m][n-1] += 1
            if(0<=m<len(A) and 0<=n+1<len(A)):
                save[m][n+1] += 1
        for i in range(0,len(A)):
            for j in range(0,len(A)):
                if(save[i][j]%2 == 1):
                    if(A[i][j] == 1):
                        A[i][j] = 0
                    else:
                        A[i][j] = 1
        return A


发表于 2022-02-18 17:09:25 回复(0)
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 a=f[i][0]-1;
            int b=f[i][1]-1;
            int len=A[0].size();
            int high=A.size();
            change(A,a,b,len,high);
        }
        return A; 
    }
    void change(vector<vector<int> >& A,int x,int y,int len,int high)
    {
            if (x > 0 ){
                A[x-1][y] = 1- A[x-1][y];
            }
            if (x < len -1){
                A[x+1][y] = 1- A[x+1][y];
            }
            if (y > 0){
                A[x][y-1] = 1- A[x][y-1];
            }
            if (y < len- 1){
                A[x][y+1] = 1- A[x][y+1];
            }
    }
};
发表于 2022-02-15 20:51:19 回复(0)
public static List<List<int>> flipChess(List<List<int>> A, List<List<int>> f)
{
            for(int i=0;i< f.Count; i++)
            {
                int x = f[i][0]-1;
                int y = f[i][1]-1;
                if ((x - 1) >= 0)
                {
                    if (A[x - 1][y] == 0) A[x - 1][y] = 1;
                    else A[x - 1][y] = 0;
                }
                if ((x + 1) < A.Count)
                {
                    if (A[x + 1][y] == 0) A[x + 1][y] = 1;
                    else A[x + 1][y] = 0;
                }
                if ((y - 1) >= 0)
                {
                    if (A[x][y - 1] == 0) A[x][y - 1] = 1;
                    else A[x][y - 1] = 0;
                }
                if ((y + 1) < A[0].Count)
                {

                    if (A[x][y + 1] == 0) A[x][y + 1] = 1;
                    else A[x][y + 1] = 0;
                }

            }
            return A;
        }

发表于 2022-01-14 13:53:17 回复(0)
import java.util.*;


public class Solution {
    public int[][] flipChess (int[][] A, int[][] f) {
        for (int i = 0; i < f.length; i++) {
            // 举例 (2, 2) -> (1, 1)
            int x = f[i][0] - 1;
            int y = f[i][1] - 1;
             if (x > 0 ){
                A[x-1][y] = 1- A[x-1][y];
            }
            if (x < A[y].length - 1){
                A[x+1][y] = 1- A[x+1][y];
            }
            if (y > 0){
                A[x][y-1] = 1- A[x][y-1];
            }
            if (y < A.length - 1){
                A[x][y+1] = 1- A[x][y+1];
            }
        }
        return A;
    }
}

发表于 2021-12-29 10:15:31 回复(0)
class Solution:
    def flipChess(self , A: List[List[int]], f: List[List[int]]) -> List[List[int]]:
        for i in f:
            for j in range(2):
                if i[0] + (-1) ** j != 0 and i[0] + (-1) ** j != 5:
                    A[i[0] + (-1) ** j - 1][i[1] - 1] = 1 - A[i[0] + (-1) ** j - 1][i[1] - 1]
                if i[1] + (-1) ** j != 0 and i[1] + (-1) ** j != 5:
                    A[i[0] - 1][i[1] + (-1) ** j - 1] = 1 - A[i[0] - 1][i[1] + (-1) ** j - 1]
        return A
发表于 2021-12-24 22:40:47 回复(0)

问题信息

难度:
16条回答 2345浏览

热门推荐

通过挑战的用户

查看代码