算法——暴力之美(volence‘s beautify of algorithm)
暴力算法(volence’s beautify of algorithm)
- 思想:利用暴力法的思想找到所有的解,然后从中选出符合问题要求的解
- 算法总结:暴力法的优点是实现简单,容易编程,但是往往会消耗更多的时间和空间资源,因此大多数暴力法还要根据应用背景尽力改进
左 | 右 |
---|---|
找到问题的所有的解 | 筛选出符合题意的解 |
- 全排列问题:
给定数据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;}}}
}
- 快速幂问题:
给定数据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;}
}
- 幂集问题
输入一个数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]);}}
}
- 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;}
}
- 约瑟夫问题
一堆人(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);}}
}
- 排列组合问题
输入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)相关推荐
- 数据结构与算法(Python)– 回溯法(Backtracking algorithm)
数据结构与算法(Python)– 回溯法(Backtracking algorithm) 1.回溯法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条 ...
- 基于改进的k最近邻算法的单体型重建问题An Improved KNN Algorithm for Haplotype Reconstruction Problem
基于改进的k最近邻算法的单体型重建问题 An Improved KNN Algorithm for Haplotype Reconstruction Problem DOI: 10.12677/csa ...
- 关于超声和光声中的延迟求和算法的详细说明 Detail description of DAS algorithm
关于超声和光声中的延迟求和算法的详细说明 Detail description of DAS algorithm 背景 background 存在问题(个人思考) 算法说明及代码示例 背景 backg ...
- 哑谜,回文和暴力之美
暴力搜索是一个有趣的东西.至少刘汝佳是这么认为的.编程之美的4.10节就是典型的暴力题.虽然作者将其难度定义为一颗星,但却不能因此认为这个类型的问题就是那么容易的,很多可能需要一些有创造力的想法. 不 ...
- 一个可以AK IOI的算法——暴力
暴力 很多问题都可以"暴力求解",不用动太大脑筋,把所有可能性都列举出来,然后一一试验.虽然暴力求解法不用动太大大脑筋,但要注意时间复杂磁.因此,对问题一定的分析往往会让算法更加简 ...
- BF算法(暴力算法)--模式匹配算法
模式匹配算法:是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配.用途:搜索引擎.拼写检查.语言翻译.数据压缩等. BF算法: ...
- 根号算法——暴力美学
零.前言 • 根号算法是一种很常见的算法 • 常见的根号思想有:双向搜索.根号分类讨论.根号重建.复杂 度平衡,以及一些根号级别的数据结构如分块和莫队 • 这些算法一般是多种暴力算法的结合,一般具有较 ...
- 枚举算法(暴力法)板子
1.枚举算法的定义: 在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么该结论是可靠 的,这种归纳方法叫做枚举法,因其逐个考察的性质又称其为"暴力枚举法" ...
- 自创算法——暴力自动机
暴力时利用自动机的最小性,可以在暴力dfs时和匹配答案时使用自动机优化,可以使纯暴力更快. struct baoli { baoli *xia[51]; baoli() { ...
最新文章
- 厚积薄发的90后:读博前三年零文章,后期发力产出11篇一作,现任985高校博导...
- php base64解码,PHP Base64 中英文编码 JavaScript 解码
- C++回声服务器_3-UDP版本
- MyBatis3 xml映射文件配置
- Mybatis实现多表关联多条件查询
- Nagios监控系统详解
- Java总结:SpringBoot的使用cmd命令进行Gradle构建
- 安装win10的笔记本有10个地方需要微调
- vSAN一次人肉工程师踩过的坑
- Mozilla 的 Flash 杀手 'Shumway' 已经现身
- iOS小白之路...iOS中基础控件的使用
- 经典排序算法(二十二)--图书馆排序(Library Sort)
- 一整个网站的全部数据,我只能给你这么多了。
- error: possibly undefined macro: LT_SYS_SYMBOL_USCORE please use m4_pattern_allow
- 两种土壤类型数据的简介、下载教程
- python里print字符串+字符串_python 字符串 和 print
- coreldraw x5 选择工具快捷键_CorelDRAW X5实用教程:X5版本常用快捷键
- 玩游戏使用云服务器,云服务器可以玩大型游戏吗?
- 人际交往三个常见问题
- 快手2020校招笔试题 2019.8.25
热门文章
- 分析Threadlocal内部实现原理,并解决Threadlocal的ThreadLocalMap的hash冲突与内存泄露
- python 多列排序_python sorted多列排序
- 【DS实践 | Coursera】Assignment 2 | Applied Plotting, Charting Data Representation in Python
- gnu linux额外支持的运算符,《Shell编程从入门到精通》张昊-chap1-8
- 【ArcGIS风暴】ArcGIS tif转jpg:JPEG压缩仅支持8位或16位无符号数据(具有一个或三个波段,且没有色彩映射表)解决方案!
- 手撕LongAdder-add()源码
- Mac OS X Lion 系统中检测 WiFi 信号强度
- xp计算机无法远程桌面连接,XP系统远程桌面开了连接不上如何解决?
- 抽象类和接口的区别,必须弄明白的
- 股权转让这个创业方向靠谱吗?关于潜力股这个创业公司的一些思考