暴力破解--穷举算法

代码骑士
优质创作者: 游戏开发技术领域
2023-01-16 15:49:46

一,什么是暴力破解法?


暴力破解法,就是把所有条件,相关情况统统考虑进去,让计算机进行检索,指导得出与之所有条件符合的结果(但是,暴力破解法对计算机资源耗费严重,如果条件太复杂,运算速度缓慢,为了解决这一问题,我们可以事先把与之不相关的条件进行限制,减少计算机的运算量)

 

二、举个例子

 

1、给出一串序列,输出它的所有子序列。

输入样例:

输入个数:3

输入序列:1,2, 3

输出样例:

1

12

123

23

3

#include<iostream>
using namespace std;
int main(){
	int n=0;
	cout<<"输入个数:";
	cin>>n; 
	int *a = new int[n]; 
	cout<<"输入序列:";
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 
	for(int q=0;q<n;q++){//q表示子序列首元素下标 
		for(int k=q;k<n;k++){
			for(int i=q;i<k+1;i++){//k+1表示子序列尾下标 
				cout<<a[i];
			}
			cout<<endl; 
		}	
	} 
	return 0;
} 

函数封装:

#include<iostream>
#define N 10000
using namespace std;

//输出整数序列的全部子序列 
void printSubsequence(int n,int a[]){
	for(int h=0;h<n;h++){//子序列首
		for(int r=h;r<n;r++){//子序列尾 
			for(int i=h;i<r+1;i++){//输出子序列
				cout<<a[i];
			} 
			cout<<endl;
		} 
	}
}

int main(){
	int n=0;
	cout<<"输入个数:";
	cin>>n; 
	int *a = new int[n]; 
	cout<<"输入序列:";
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 
	//printSubsequence(n,a);
	
	return 0;
} 

输出:

 2、给出两串序列,输出它们相同的子序列。

输入样例:

输入序列1的个数:3
输入序列1元素:1 2 3
输入序列2的个数:2
输入序列2元素:2 3

输出样例:

2 长度:1
23 长度:2
3 长度:1

#include<iostream>
#include<string.h>
#define N 10000
using namespace std;

//输出整数序列的全部子序列 
void printSubsequence(int n,int a[]){
	for(int h=0;h<n;h++){//子序列首
		for(int r=h;r<n;r++){//子序列尾 
			for(int i=h;i<r+1;i++){//输出子序列
				cout<<a[i];
			} 
			cout<<endl;
		} 
	}
}

//将全部子序列转化成字符串并存储在字符串数组中 
void strSubsequence(int *strlen,int n,int a[],string strs[]){
	string str;
	int slen=0,si=0;
	for(int h=0;h<n;h++){//子序列首
		for(int r=h;r<n;r++){//子序列尾 
			for(int i=h;i<r+1;i++){//输出子序列
				str+=a[i]+'0';
			} 
			//cout<<str<<endl;
			strs[si++]=str;
			slen++;
			str="";//清空上一个子串 
		} 
	}
	for(int i=0;i<slen;i++){
		//cout<<strs[i]<<",";
	}
	*strlen=slen;
}
 
int main(){
	int n=0;
	cout<<"输入序列1的个数:";
	cin>>n; 
	int *a = new int[n]; 
	cout<<"输入序列1元素:";
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 
	//printSubsequence(n,a);
	//定义字符串数组
	string strs[N];
	int strlen=0;
	strSubsequence(&strlen,n,a,strs);
	//输入序列2 
	int n2=0;
	cout<<"输入序列2的个数:";
	cin>>n2; 
	int *b = new int[n2]; 
	cout<<"输入序列2元素:";
	for(int i=0;i<n2;i++){
		cin>>b[i];
	} 
	//比较 
	string str;
	for(int h=0;h<n2;h++){//子序列首
		for(int r=h;r<n2;r++){//子序列尾 
			for(int i=h;i<r+1;i++){//输出子序列
				str+=b[i]+'0';
			} 
			//cout<<str<<endl;
			for(int si=0;si<strlen;si++){
				if(str==strs[si]){
					cout<<strs[si]<<" "<<"长度:"<<(strs[si]).length()<<endl; 
				}
			} 
			str="";//清空上一个子串 
		} 
	}
	return 0;
} 

输出:

 

 

...全文
316 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码骑士 2023-01-16
  • 打赏
  • 举报
回复

本例中的子序列满足条件为:在原序列中递增且连续。如果不满足此情况,可能性会更多,建议使用递归算法。

代码骑士 2023-01-16
  • 举报
回复
@代码骑士 例题的求解均是“子串”而不是子序列,这里做以下更改。 注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。

5

社区成员

发帖
与我相关
我的任务
社区描述
考研408:数据结构、计算机组成原理、操作系统、计算机网络
学习方法考研面试 其他
社区管理员
  • 代码骑士
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧