java黑白格问题

package week_01;

import javax.xml.transform.Result;

/*
*  n * n 的网格。绘画规则为,可以选择任意多行以及任意多列的格子涂成黑色,所选行数、列数均可为 0。
    最终的成品上需要有 k 个黑色格子,请返回共有多少种涂色方案。
限制: 1 <= n <= 6
    0 <= k <= n * n
示例:输入:n = 2, k = 2

输出:4

解释:一共有四种不同的方案:
第一种方案:涂第一列;
第二种方案:涂第二列;
第三种方案:涂第一行;
第四种方案:涂第二行。

输入:n = 2, k = 1

输出:0

解释:不可行,因为第一次涂色至少会涂两个黑格。


*/
public class Day_3 {
    //定义阶乘函数
    public int f(int n){
        if (n == 0) return 1;
        else return n*f(n-1);
    }

    //定义组合数函数
    public int d(int n,int target){
        return f(n)/(f(target)*f(n-target));
    }


    public int paintingPlan(int n, int k) {

        if(1 <= n && n<= 6 && 0 <= k && k <= n*n) {

            if (k == n*n || k==0) return  1;

            else if (k == n) return   n*n;
            else {

                int result = 0;
//                       temp =0;
                //a为行,b为列
                for (int a = 0 ; a <= n ;a++){
//A                  if (temp ==1) break;
                    for (int b = 0 ; b <= n ;b++){

                        //1、a行b列所占黑色块就是a*n+b(n-1)
                        //2、因为是正方形,求得的a,b值是一组double结果(不理解的话把注释A去掉,加上a,b的输出即可)
                        if (a*n+b*n-a*b == k){
//A                            temp =1;

                            //多种情况,所以 +=
                            result +=d(n,a)*d(n,b);
//                           System.out.println(result);
                        }

                    }
                }
                return result;
            }


        }else return -1;

    }

    public static void main(String[] args) {
        System.out.println(new Day_3().paintingPlan(2,2));

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值