首页 > 试题广场 >

翻转翻转

[编程题]翻转翻转
  • 热度指数:5465 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个N*M的矩阵,在矩阵中每一块有一张牌,我们假定刚开始的时候所有牌的牌面向上。
现在对于每个块进行如下操作:
> 翻转某个块中的牌,并且与之相邻的其余八张牌也会被翻转。
XXX
XXX
XXX
如上矩阵所示,翻转中间那块时,这九块中的牌都会被翻转一次。
请输出在对矩阵中每一块进行如上操作以后,牌面向下的块的个数。

数据范围:

输入描述:
输入的第一行为测试用例数t(1 <= t <= 100000),
接下来t行,每行包含两个整数N,M(0 <= N, M <= 1,000,000,000)


输出描述:
对于每个用例输出包含一行,输出牌面向下的块的个数
示例1

输入

5
1 1
1 2
3 1
4 1
2 2

输出

1
0
1
2
0
javascript涉及大数相乘
var lines = readline();
for(var i=0;i<lines;i++){
    var arr = readline().split(" ")
    var res = 0;
    var m = arr[0];
    var n = arr[1];
    if(m<n){
        var flag = n;
        n = m;
        m =flag;
    }
    if(m==1&&n==1){
        res = 1;
    }else if(n==1){
        res = m-2;
    }else{
        m-=2;
        n-=2;
        if((m+"").length+(n+"").length>=16){
            var arr1 = (m+"").split("");
            var arr2 = (n+"").split("")
            var arr3 = [];
            for(var j=arr1.length-1;j>=0;j--){
                for(var q =arr2.length-1;q>=0;q--){
                    var num = arr1[j]*arr2[q];
                    num = arr3[q+j+1]?arr3[q+j+1]+num:num;
                    arr3[q+j+1]=num%10;
                    arr3[q+j]=arr3[q+j]?Math.floor((arr3[q+j]*10+num)/10):Math.floor(num/10);
                    
                }
            }
            res = arr3[0]?arr3.join(""):arr3.slice(1).join("");
            
        }else{
            res = m*n
        }
    }
    console.log(res)
}
发表于 2020-04-07 10:26:15 回复(1)