[编程题] 棋子翻转
链接:https://www.nowcoder.com/questionTerminal/b0d2c7f3a5b1429ba41997dc935f2594
来源:牛客网
时间限制:
C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M。
在4*4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。
思路是分四种情况。分别计算有上棋子的情况、有下棋子、有左棋子、有右棋子的情况。
补充
二维数组里面,竖列为x,横列为y。
在Java中,步骤^ = 1是什么意思?
^代表XOR运算符。
它位于赋值运算符类别之下
+= -= *= /= %= &= ^= |= <<= >>= >>>=
^= 表示 按位异或和赋值运算符
step ^=1;与step = step ^ 1;相同
正如其他人所指出的那样,step ^=1翻转step的最低位。这使偶数数字变大1,奇数数字变小1。
示例:
0 --> 1
1 --> 0
7 --> 6 二进制转换为 111 -->110
6 --> 7 二进制转换为 110 --> 111
-3 --> -4
参考
https://www.thinbug.com/q/27916151
代码实现
/**
* @Description: 棋子翻转
* @Author: ai
* @create: 2021-11-30 10:31
*/
public class ChessFilp {
/**
* https://blog.csdn.net/sinat_37341950/article/details/78495282
*
* @param args
*/
public static void main(String[] args) {
int[][] A = {{0, 0, 1, 1}, {1, 0, 1, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}};
int[][] f = {{2, 2}, {3, 3}, {4, 4}};
int[][] result = chessFilp(A, f);
for (int i = 0; i < result.length; i++) {
System.out.println(Arrays.toString(result[i]));
}
}
/**
* 思路是分四种情况。分别计算有上棋子的情况、有下棋子、有左棋子、有右棋子的情况。
*
* @param A
* @param f
* @return
*/
public static int[][] chessFilp(int[][] A, int[][] f) {
// write code here
for (int i = 0; i < f.length; i++)// 以翻转位置为中心
{
int x = f[i][0] - 1;
int y = f[i][1] - 1;
if (x > 0)
A[x - 1][y] ^= 1;
if (x < A.length - 1)
A[x + 1][y] ^= 1;
if (y > 0)
A[x][y - 1] ^= 1;
if (y < A[0].length - 1)
A[x][y + 1] ^= 1;
}
return A;
}
}