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));
}
}
java黑白格问题
最新推荐文章于 2022-05-12 09:53:35 发布