用递归的方法求解,对于一些特殊的情况 单独讨论返回,比如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;
}
}