题目描述:
给定一个N*M的矩阵,在矩阵中每一块有一张牌,我们假定刚开始的时候所有牌的牌面向上。
现在对于每个块进行如下操作:
翻转某个块中的牌,并且与之相邻的其余八张牌也会被翻转。
XXX
XXX
XXX
如上矩阵所示,翻转中间那块时,这九块中的牌都会被翻转一次。
请输出在对矩阵中每一块进行如上操作以后,牌面向下的块的个数。
输入描述:
输入第一行为测试用例t(1<=t<=100000),接下来t行,每行包含两个整数N,M(1<=N,M<=1000000000)
输出描述:
输出仅包含一行,输出牌面向下的块的个数。
测试用例
输入:
5
1 1
1 2
3 1
4 1
2 2
输出:
1
0
1
2
0
思路解析
个人思路如下:统计每一个元素周围相邻的元素个数,还要加上自己本身,即为翻转次数,若这个数字为偶数,则最后结果中该元素未翻转,若为奇数,则翻转了。
代码实现
import java.math.BigInteger;
import java.util.Scanner;
/*
这段代码,测试用例只能通过80%,在网上找不到AC的代码,
所以自己写出来,算是抛砖引玉,同时希望各位大佬指点,
哪里考虑的不仔细。
*/
public class FanZhuanJuZhen {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
for (int i=0;i<t;i++){
long N = scanner.nextLong();
long M = scanner.nextLong();
//int M = scanner.nextInt();
System.out.println(FanZhuanJuZhen(N,M));
}
}
public static BigInteger FanZhuanJuZhen(long n,long m){
BigInteger a= BigInteger.valueOf(0);
if (n<=0||m<=0||m==2||n==2){
return BigInteger.valueOf(0);
}if (n==1||m==1){
long temp = n>m?n:m;
if (temp==1){
return BigInteger.valueOf(1);
}else if (temp==2){
return BigInteger.valueOf(0);
}else {
return BigInteger.valueOf(temp-2);
}
}else {
if (n>2&&m>2){
return BigInteger.valueOf((n-2)*(m-2));
}
}
return a;
}
}