暴力算法(volence’s beautify of algorithm)

  • 思想:利用暴力法的思想找到所有的解,然后从中选出符合问题要求的解
  • 算法总结:暴力法的优点是实现简单,容易编程,但是往往会消耗更多的时间和空间资源,因此大多数暴力法还要根据应用背景尽力改进
找到问题的所有的解 筛选出符合题意的解
  1. 全排列问题:

给定数据k,请依照样例,输出其全排列
思路:设置一个数组来存储1-k的数字,然后再设置一个数组记录每个数字的访问情况,
最后用一个栈来记录访问的路径,再依次深度递归,并修改标记,递归回程时恢复标记,
如果栈的大小大于k则输出此次排列,直到递归到所有的子树
样例1:
3
输出:
123
132
213
231
312
321
样例2:
4
输出:
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
代码如下:

思路:设置一个数组来存储1-k的数字,然后再设置一个数组记录每个数字的访问情况,
最后用一个栈来记录访问的路径,再依次深度递归,并修改标记,递归回程时恢复标记,
如果栈的大小大于k则输出此次排列,直到递归到所有的子树
样例1:
3
输出:
123
132
213
231
312
321
样例2:
4
输出:
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
代码如下:import java.util.Scanner;// Created by Chenglong Shi on 2021/10/19.
// Only can use to study
// Once found commercial or illegal use will be pursued to the end
// Banning plagiarism
// Email:2230307855@qq.com
// 内部可能含有拼音和汉语注释
// by 史成龙
// 方法:
//
public class AllPermutation {static final int ma=10;static int n,top=0;static int []a=new int[ma];static int []st=new int[ma];static int []vis=new int[ma];public static void main(String[] args) {Scanner in=new Scanner(System.in);n=in.nextInt();for(int i=0;i<n;i++) a[i]=i+1;getPermutation(1);in.close();}public static void show(){for(int i=0;i<top;i++) System.out.print(st[i]);System.out.println();}public static void getPermutation(int floor){if(floor>n){show();return;}for(int i=0;i<n;i++){if(vis[i]==0){st[top++]=a[i];vis[i]=1;getPermutation(floor+1);top--;vis[i]=0;}}}
}
  1. 快速幂问题:

给定数据a和b在给定时间内输出a的b次方
思路:用递归的方式编程,用long类型来存储数据,每次将b折半,直到b的值为1的时候,返回a的值,然后在每次回溯中判断b是偶数还是奇数,如果是偶数则返回上一层函数返回的值的平方,否则返回上一层值的平方乘以a。当回溯完毕后返回的就是a的b的次方
样例1:
3 8
输出
6561
样例2:
2 4
输出:
16
代码如下:

// Created by Chenglong Shi on 2021/10/16.
// Only can use to study
// Once found commercial or illegal use will be pursued to the end
// Banning plagiarism
// Email:2230307855@qq.com
// 内部可能含有拼音和汉语注释
// by 史成龙
// 方法:递归
//
import java.util.Scanner;public class fast_power {private static long a;private static long b;public static void main(String[] args) {Scanner in =new Scanner(System.in);while(in.hasNext()){a=in.nextLong();b=in.nextLong();System.out.println(fast_power(b));}in.close();}public static long fast_power(long b){if(b<=1) return a;long temp=fast_power(b/2);if(b%2==0) return temp*temp;else return temp*temp*a;}
}
  1. 幂集问题

输入一个数k,输出集合元素为1-k的集合的子集
思路:用二进制的方式每次测试0-2的k次方的相于运算的结果,如果相与的结果大于等于0,则表示此时相与元素是当前目标集合的元素,循环结束后即可输出所有的子集,同时使用二进制的方式可以加速程序的运行
输入样例1:
3
输出:
{}
{1}
{2}
{3}
{1,2}
{1,3}
{2,3}
{1,2,3}
输入样例2:
2
输出:
{}
{1}
{2}
{1,2}
代码如下:

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;// Created by Chenglong Shi on 2021/10/16.
// Only can use to study
// Once found commercial or illegal use will be pursued to the end
// Banning plagiarism
// Email:2230307855@qq.com
// 内部可能含有拼音和汉语注释
// by 史成龙
// 方法:二进制获得幂集
// Copyright (c) 2021 幂集的获得. All rights reserved.
//
public class pow_set {private static int n,index=1;static final int ma=1080;static String []result=new String[ma];public static void main(String[] args) {for(int i=0;i<ma;i++) result[i]="-";Scanner in=new Scanner(System.in);n=in.nextInt();int len=(int)Math.pow(2,n);getsq();Arrays.sort(result,1,len, new Comparator() {@Overridepublic int compare(Object o1, Object o2) {String k1=(String) o1,k2=(String) o2;if(k1.length()==k2.length()) return k1.compareTo(k2);else return k1.length()-k2.length();}});show(len);in.close();}public static void getsq(){for(int i=0;i<(1<<n);i++){String m="{";for(int j=0;j<n;j++){if((i&(1<<j))>0){//                   System.out.println("j is:"+j);if(m.length()==1) m+=String.valueOf(j+1);else m+=(","+String.valueOf(j+1));}}m+="}";
//           System.out.print("m is:"+m);
//           System.out.println("---------------");result[index++]=new String(m);}}public static void show(int len){for(int i=1;i<=len;i++)if(result[i].length()>0){System.out.println(result[i]);}}
}
  1. n皇后

输入n,代表n个皇后,放置的规则是每个皇后不同行,不同列,不同左右对角线,输出其对应的所有解。
思路:用回溯的方法先一行一行的放,然后列数从1开始,判断此行当前列是否与前面的列和对角线冲突,如果冲突,立即放弃本次放置,再判断其他的放置方式。如果放置n个后就输出这个方案
输入样例1:
6
输出:
1: (1,2) (2,4) (3,6) (4,1) (5,3) (6,5)
2: (1,3) (2,6) (3,2) (4,5) (5,1) (6,4)
3: (1,4) (2,1) (3,5) (4,2) (5,6) (6,3)
4: (1,5) (2,3) (3,1) (4,6) (5,4) (6,2)
输入样例2:
4
输出:
1: (1,2) (2,4) (3,1) (4,3)
2: (1,3) (2,1) (3,4) (4,2)
代码如下:

// Created by Chenglong Shi on 2021/10/17.
// Only can use to study
// Once found commercial or illegal use will be pursued to the end
// Banning plagiarism
// Email:2230307855@qq.com
// 内部可能含有拼音和汉语注释
// by 史成龙
// 方法:
//
import java.util.Scanner;public class n_queens {static int n;final static int ma=20;static int index=1;static int []col=new int[ma];//最大15行15列public static void main(String[] args) {Scanner in=new Scanner(System.in);n=in.nextInt();pushQueen(1);in.close();}static void pushQueen(int rows){if(rows>n) show();for(int j=1;j<=n;j++){if(isCanPut(rows,j)){col[rows]=j;pushQueen(rows+1);}}}static void show(){System.out.print(index+": ");for(int i=1;i<=n;i++)if(i==1) System.out.print("("+i+","+col[i]+")");else System.out.print(" ("+i+","+col[i]+")");System.out.println();index++;}static boolean isCanPut(int i,int j){if(i==1) return true;int pre=1;while(pre<i){if(col[pre]==j||(Math.abs(i-pre)==Math.abs(j-col[pre])))return false;pre++;}return true;}
}
  1. 约瑟夫问题

一堆人(n个人)坐在一个圆桌上,每次从1开始数,数到m的人自动请出圆桌,然后下一个人借着从1开始数,一直做上述的步骤,现在请你输出,最后剩下的那个人的编号。
思路:利用取模的思想来求出每次需要剔除的人的编号,剔除后,相当于桌子变小,然后进一步取模,直到桌子的大小变为1,然后输出剩下的那个人的编号即可。
输入样例1:
6 2
输出:
5
输入样例2:
12 4
输出:
1
代码如下:

import java.util.ArrayList;
import java.util.Scanner;
public class yue_se_fu {static int n,m;static ArrayList<Integer> arr=new ArrayList<Integer>();public static void main(String[] args) {Scanner in=new Scanner(System.in);while(true){n=in.nextInt();m=in.nextInt();if(n==0&&m==0) break;arr.clear();for(int i=1;i<=n;i++) arr.add(i);manageCircle(arr);}in.close();}static void manageCircle(ArrayList<Integer> arr){int index=0;while(arr.size()>0){if(arr.size()==1){System.out.println(arr.get(0));break;}index=(index+m-1)% arr.size();arr.remove(index);}}
}
  1. 排列组合问题

输入m和n,输出排列数和组合数(排列数A(m,n),组合数C(m,n))
思路:根据公式A(m,n)=n!/(n-m)! B(m,n)=A(m,n)/m!,设计出一个求阶乘的函数,然后化简带入到公式即可求出,排列数和组合数。
输入样例1:
4 4
输出:
24 1
输入样例2
3 4
输出:
24 4
代码如下:

import java.util.Scanner;
// Created by Chenglong Shi on 2021/10/19.
// Only can use to study
// Once found commercial or illegal use will be pursued to the end
// Banning plagiarism
// Email:2230307855@qq.com
// 内部可能含有拼音和汉语注释
// by 史成龙
// 方法:
//
public class permutation_and_combination {static long m,n;public static void main(String[] args) {Scanner in=new Scanner(System.in);m=in.nextLong(); n=in.nextLong();if(m==0&&n==0) System.out.println("0 0");elseSystem.out.println(get_Permutation()+" "+get_combination());in.close();}static long getJieCheng(long be,long en){if(be==0) return 1;long num=be;for(long k=be+1;k<=en;k++) num*=k;return num;}static long get_Permutation(){long deli=n-m;if(deli==n) return 1;else if(deli==0) return getJieCheng(1,n);else return getJieCheng(n-m+1,n);}static long get_combination(){return get_Permutation()/getJieCheng(1,m);}
}
  • 希望大家多去理解理解西靠思考将其转换为自己得知识,感谢大家一起努力!

算法——暴力之美(volence‘s beautify of algorithm)相关推荐

  1. 数据结构与算法(Python)– 回溯法(Backtracking algorithm)

    数据结构与算法(Python)– 回溯法(Backtracking algorithm) 1.回溯法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条 ...

  2. 基于改进的k最近邻算法的单体型重建问题An Improved KNN Algorithm for Haplotype Reconstruction Problem

    基于改进的k最近邻算法的单体型重建问题 An Improved KNN Algorithm for Haplotype Reconstruction Problem DOI: 10.12677/csa ...

  3. 关于超声和光声中的延迟求和算法的详细说明 Detail description of DAS algorithm

    关于超声和光声中的延迟求和算法的详细说明 Detail description of DAS algorithm 背景 background 存在问题(个人思考) 算法说明及代码示例 背景 backg ...

  4. 哑谜,回文和暴力之美

    暴力搜索是一个有趣的东西.至少刘汝佳是这么认为的.编程之美的4.10节就是典型的暴力题.虽然作者将其难度定义为一颗星,但却不能因此认为这个类型的问题就是那么容易的,很多可能需要一些有创造力的想法. 不 ...

  5. 一个可以AK IOI的算法——暴力

    暴力 很多问题都可以"暴力求解",不用动太大脑筋,把所有可能性都列举出来,然后一一试验.虽然暴力求解法不用动太大大脑筋,但要注意时间复杂磁.因此,对问题一定的分析往往会让算法更加简 ...

  6. BF算法(暴力算法)--模式匹配算法

    模式匹配算法:是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配.用途:搜索引擎.拼写检查.语言翻译.数据压缩等. BF算法:         ...

  7. 根号算法——暴力美学

    零.前言 • 根号算法是一种很常见的算法 • 常见的根号思想有:双向搜索.根号分类讨论.根号重建.复杂 度平衡,以及一些根号级别的数据结构如分块和莫队 • 这些算法一般是多种暴力算法的结合,一般具有较 ...

  8. 枚举算法(暴力法)板子

    1.枚举算法的定义: 在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么该结论是可靠 的,这种归纳方法叫做枚举法,因其逐个考察的性质又称其为"暴力枚举法" ...

  9. 自创算法——暴力自动机

    暴力时利用自动机的最小性,可以在暴力dfs时和匹配答案时使用自动机优化,可以使纯暴力更快. struct baoli {     baoli *xia[51];     baoli()     {   ...

最新文章

  1. 厚积薄发的90后:读博前三年零文章,后期发力产出11篇一作,现任985高校博导...
  2. php base64解码,PHP Base64 中英文编码 JavaScript 解码
  3. C++回声服务器_3-UDP版本
  4. MyBatis3 xml映射文件配置
  5. Mybatis实现多表关联多条件查询
  6. Nagios监控系统详解
  7. Java总结:SpringBoot的使用cmd命令进行Gradle构建
  8. 安装win10的笔记本有10个地方需要微调
  9. vSAN一次人肉工程师踩过的坑
  10. Mozilla 的 Flash 杀手 'Shumway' 已经现身
  11. iOS小白之路...iOS中基础控件的使用
  12. 经典排序算法(二十二)--图书馆排序(Library Sort)
  13. 一整个网站的全部数据,我只能给你这么多了。
  14. error: possibly undefined macro: LT_SYS_SYMBOL_USCORE please use m4_pattern_allow
  15. 两种土壤类型数据的简介、下载教程
  16. python里print字符串+字符串_python 字符串 和 print
  17. coreldraw x5 选择工具快捷键_CorelDRAW X5实用教程:X5版本常用快捷键
  18. 玩游戏使用云服务器,云服务器可以玩大型游戏吗?
  19. 人际交往三个常见问题
  20. 快手2020校招笔试题 2019.8.25

热门文章

  1. 分析Threadlocal内部实现原理,并解决Threadlocal的ThreadLocalMap的hash冲突与内存泄露
  2. python 多列排序_python sorted多列排序
  3. 【DS实践 | Coursera】Assignment 2 | Applied Plotting, Charting Data Representation in Python
  4. gnu linux额外支持的运算符,《Shell编程从入门到精通》张昊-chap1-8
  5. 【ArcGIS风暴】ArcGIS tif转jpg:JPEG压缩仅支持8位或16位无符号数据(具有一个或三个波段,且没有色彩映射表)解决方案!
  6. 手撕LongAdder-add()源码
  7. Mac OS X Lion 系统中检测 WiFi 信号强度
  8. xp计算机无法远程桌面连接,XP系统远程桌面开了连接不上如何解决?
  9. 抽象类和接口的区别,必须弄明白的
  10. 股权转让这个创业方向靠谱吗?关于潜力股这个创业公司的一些思考