着色问题 一个圆分成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; 
 }
}

你可能感兴趣的:(着色问题 一个圆分成N个扇形,M种颜色,相邻区块重色 总工的着色方法数)