还是用到dfs的做法:
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。
深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。
伪代码[编辑]
1 void dfs()
2 {
3 // 判断是否到达终点
4 if() {
5 return;
6 }
7
8 // 尝试每一个可走方向(右下左上)
9 for(i=0; i<n; i++){
10 // 判断是否可走,可走调用递归尝试下一步,不可走则尝试该点的其他方向
11 if () {
12 // 继续下一步
13 dfs();
14 }
15 }
16 }
package com.huat.lanqiao7;
/**
*
* @author yanzz
* @编辑时间:2018年3月14日
* @功能说明: 抽签
* X星球要派出一个5人组成的观察团前往W星。 其中: A国最多可以派出4人。
* B国最多可以派出2人。 C国最多可以派出2人。 ....
* 那么最终派往W星的观察团会有多少种国别的不同组合呢?
* 下面的程序解决了这个问题。 数组a[] 中既是每个国家可以派出的最多的名额。
* 程序执行结果为:
* DEFFF
* CEFFF
* CDFFF
* CDEFF
* CCFFF CCEFF CCDFF CCDEF BEFFF BDFFF BDEFF BCFFF BCEFF BCDFF
* BCDEF .... (以下省略,总共101行)
* 仔细阅读代码,填写划线部分缺少的内容。
*
* 注意:不要填写任何已有内容或说明性文字。
*
* @version:
*/
public class NO_5 {
/**
* 用到的方法dfs
* a[]:表示每个国家最多可指派的人数
* k:表示当前是哪个国家
* n:还可以指派多少个人
* s:已经被派送的字符串
*/
public static void f(int[] a,int k, int n, String s) {
//判断是否达到终点
if (k == a.length) {
if (n == 0)
System.out.println(s);
return ;
}
String s2 = s;
for(int i = 0; i <= a[k]; i++) {
f(a,k+1, 5-s2.length(),s2);
s2 += (char)(k+'A');
}
}
public static void main(String[] args) {
int[] a = {4,2,2,1,1,3};
f(a,0,5,"");
}
}