全排列代码基本结构及题目汇集

全排列

基本结构是我自己总结的,其他代码是从网上一个一个查的。
具体题目和解决代码请自己搜索吧,我只是查找的核心代码

全排列核心代码的基本结构:

public static void ff(int m)//函数名(参数个数需要看题)

If(找到一个满足长度条件的子方案){

If(该子方案满足全部条件)

{

计数+1;
return;

}

}

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值