着色问题 一个圆分成N个扇形,M种颜色,相邻区块重色 总工的着色方法数

用递归的方法求解,对于一些特殊的情况 单独讨论返回,比如N=3 M<2一定无解之类的,吧递归的最底层 color(1,M) color(2,M)等直接返回值。

对于这里用N来做递归的原因 就不多解释了吧(可能我的算法学的不是很好,直觉告诉我用N)

N,M 考虑两种情况,新加的第N块扇形的颜色跟旁边两块相关,

1.  如果旁边两块颜色不同 那么是color(N-1,M),那么第N块有M-2种颜色,有color(N-1,M)*(M-2)种可能;

2.  如果旁边两块颜色相同 那么是color(N-2,M)(相当于可以随便去掉第N块旁边的一块不影响讨论),那么第N块有M-1种颜色,有color(N-2,M)*(M-1)种可能;

综上,有1+2种情况。

package ForOffer;



import java.util.Scanner;


public class Offer {
 public static  void main(String[] args){
	 System.out.println("请输入N,M");
	 Scanner scan = new  Scanner(System.in);
	 int  N = scan.nextInt();
	 int  M = scan.nextInt();
	 
	 if(N >= 1 && M>=1){
		 int kind = color(N,M);
		 System.out.println ("涂颜色种类为"+kind);	 
	 }
 }
 public static int color (int N,int M){
	 int kind_new = 0;
	 if(N == 1 && M >=1)
		 return M;
	 if(N == 2 && M >=2)
		 return M*(M-1);
	 if(N == 3 && M>=3)
		 return M*(M-1)*(M-2);
	 if(N >3 && M >=2){
		 kind_new=color(N-1,M)*(M-2) + color(N-2,M)*(M-1);//迭代 分两种情况 求和
	 }
	 return kind_new; 
 }
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值