全排列
全排列核心代码的基本结构:
public static void ff(int m)//函数名(参数个数需要看题)
If(找到一个满足长度条件的子方案){
If(该子方案满足全部条件)
{
}
}
for(层数设计)
{
(考虑对数字是否有特别限制,如果有限制则考虑一些应对方法,如:设置boolean 数组标记是否读取。)
回溯法的使用
1. 进行交换或者标记
2. 使用改变了条件的数值递归自身
3. 再次交换或者取消标记,让数值回到初始状态
}
基础:0-9的全排列
public static void dfs(int arr[], int num, int k) {
if (num == k) {// 递归出口
if (panDuan(arr)) {// 筛选
// 里面可以输出,计数,根据具体情况填写
count++;
for (int i = 0; i < k; i++) {
System.out.print(arr[i]);
}
System.out.println();
}
}
for (int i = num; i < arr.length; i++) {
swap(arr, num, i);
dfs(arr, num + 1, k);
swap(arr, num, i);
}
}
1.凑算式
①:这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
public static void ff(int m)
{
if(m==10){
if(check())count++;
}
for(int i=1;i<=9;i++)
{
if(k[i]==false) //由①可知我们需要使用这行代码,来使用回溯法
{
k[i]=true; //回溯法
g[m]=i;
ff(m+1);
k[i]=false;
}
}
}
2. 牌型种数
public static void calc(int m,int n,int t[])
{
if(n==13){
count++;
return;
}
if(m==13){return;}
for(int i=0;i<=4;i++)
{
n+=i;
t[m]=i;
calc(m+1,n,t);
n-=i;
}
}
3.三羊献瑞
static void dfs(int deep){
if (deep==9) {
int up = result[1]*1000 + result[2]*100 + result[3]*10 + result[4];
int down = result[5]*1000 + result[6]*100 + result[7]*10 + result[2];
int res = result[5]*10000+result[6]*1000 + result[3]*100 + result[2]*10 + result[8];
boolean b = (up + down) == res && result[5]==1;
if (b) {
for (int i = 1; i <=8; i++) {
System.out.print(result[i]);
}
System.out.println();
}
return ;
}
for (int i = 0; i <= 9; i++) {
if (visit[i] == 0) {
result[deep] = i;
visit[i] = 1;
dfs(deep+1);
visit[i] = 0;
}
}
}
4.带分数
static void fun(int cnt)
{
if(cnt == arr.length)
{
fun2();
return;
}
for(int i = cnt; i < arr.length; ++i)
{
{int t = arr[cnt];arr[cnt] = arr[i];arr[i] = t;}
fun(cnt+1);
{int t = arr[cnt];arr[cnt] = arr[i];arr[i] = t;}
}
}
5. 方格填数
private static void dfs(int[] a, boolean[] visit, int num) {
// TODO Auto-generated method stub
if (num==11) {
if (judge(a)) {
count++;
}
return;
}
for (a[num] = 0; a[num] < 10; a[num]++) {
if (visit[a[num]]==false) {
visit[a[num]]=true;
num = num + 1;
dfs(a, visit, num);
num = num - 1;
visit[a[num]]=false;
}
}
}
6. 八皇后问题
private static void sort(List<Integer> datas, List<Integer> target) {
if (datas.size() == 0) {
Set<Integer> s1 = new HashSet<Integer>();
Set<Integer> s2 = new HashSet<Integer>();
for (int i = 0; i < target.size(); i++) {
s1.add(i + target.get(i));
s2.add(i - target.get(i));
}
if (s1.size() == 8 && s2.size() == 8) {
list.add(target);
}
return;
}
for (int i = 0; i < datas.size(); i++) {
List<Integer> newDatas = new ArrayList<Integer>(datas);
List<Integer> newTarget = new ArrayList<Integer>(target);
newTarget.add(newDatas.get(i));
newDatas.remove(i);
sort(newDatas, newTarget);
}
}