【算法设计zxd】第四章蛮力法 1.枚举法 02穷举查找

目录

 

蛮力法(brute force):

【例4-1】链环数字对

 问题分析

 计算模型

pair_digital(int n):

代码:

【例4-2】解数字迷:

思考题:ACM预测:​

问题分析:

计算模型:

算法分析:

Assume():

代码

 【例4-3】输出玫瑰矩阵,其为n*n的方阵,特征如下所示:

思考题:

算法2:

算法分析:

代码:

问题分析:

计算模型:

二、穷举查找

【例4-4】旅行商问题(traveling salesman problem,TSP)——排列树

问题分析

计算模型

代码:

1.蛮力字符比较

2.旅行路线 效率类型

3.城市个数

【例4-5】背包问题。——组合森林

 问题分析

 计算模型

图的搜索

思考题

1.广度优先 三壶问题

2.广度优先 迷宫最优解

代码00:队列

01:栈

02栈:


蛮力法(brute force):

直接基于问题的 描述和所涉及的概念定义的进行算法 设计,简单而直接。
使用蛮力法… :
(1) 蛮力法所能解决的问题跨越的领域非常广泛。
(2) 对于一些重要的问题,运用蛮力策略可以设计出具备一
定实用价值的算法,并且不用限制实例的规模。
(3) 当要解决的问题实例不多并且可以接受蛮力法的运算速
度时,蛮力法的设计代价通常较为低廉。
(4) 蛮力算法可以作为衡量其它算法的准绳,服务于研究或
教学。
 枚举法的算法框架可表示如下:
(1) 依据问题,设定枚举范围
(2) 找出约束条件,建立计算模型
(3) 利用计算模型在枚举范围内搜索可能的解。

【例4-1】链环数字对

输入n个数字(在0与9之间),然后统计出这组数中
相邻两个数字组成的链环数字对出现的次数。如:n=20,输
入为:0 1 5 9 8 7 2 2 2 3 2 7 8 7 8 7 9 6 5 9,则输
出为(7,8)=2, (8,7)=3,(7,2)=1,(2,7)=1,(2,2)=2,(2,3)=1,(3,2)=1。

问题分析

设置一个二维数组,让其两个下标代表输入的数字对,
每输入一个数字对,则把对应下标的数组元素加1,若x i
示输入的数字,在输入x i ,x i+1 ,x i+2 时,a[x i ,x i+1 ] =a[x i ,x i+1 ]+1、
a[x i+1 ,x i+2 ] =a[x i+1 ,x i+2 ]+1,依此类推。

计算模型

(1) 计数:输入任意两数字x i x i+1 ,则a[x i ,x i+1 ]++。
(2) 统计:若a[x i ,x i+1 ]≥1和a[x i+1 ,x i ]≥1均大于1,表示有链
环数字对(x i ,x i+1 )( x i+1 ,x i ),输出。
(2) 存储

输入n个数字(在0与9之间),然后统计出这组数中相邻两个数 字组成的链环数字对出现的次数。
算法设计与描述 算法分析
输入:n,x1,x2,....,xn
输出:有效数字对

pair_digital(int n):

{

        int a[10,10] <- {0} ;

        input( x1 );

        for( i<- 1; i<n;i<-i+1)

        {
                input(x2);

                a[x1,x2] <- a[x1, x2]+1;

                x1<-x2;

        } 

        for ( i<-0 ;i<10;i<-i+1 )

        {

                for(j<-0 ;j<=i;j<-j+1)

                {

                        if(a[i,j]!=0  and a[j,i]!=0)

                                if(i!=j)

                                        output( (i,j) = a[i,j] , (j,i) =a[j,i ]  );

                                        else output( (i,j)=a[i,j]);//对角线元素

                }
        }

}

(1)输入n个元素,计数矩阵10*10

(2)核心语句包括两部分:统计和输出

(3)

当n>>100时,是上面的部分占比较大。

代码:
 

#include<iostream>
using namespace std;

int main()
{
	int n=20;
	int x[n]={0, 1, 5, 9 ,8 ,7, 2 ,2 ,2 ,3, 2, 7 ,8, 7 ,8 ,7, 9, 6, 5 ,9};
	
	int a[10][10]={0,0};
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			a[i][j]=0;
		}
	}
	for(int i=1;i<n;++i)
	{
		a[x[i-1]][x[i]] = a[x[i-1]][x[i]]+1;
//		cout<<a[x[i-1]][x[i]]<<endl;
	}
	for(int i=0;i<10;++i)
	{
		for(int j=0;j<=i;++j)
		{
			if(a[i][j]!=0 && a[j][i]!=0)
			{
				if(i!=j)
				{
					cout<<"("<<i<<","<<j<<")="<<a[i][j]<<"\t";
					cout<<"("<<j<<","<<i<<")="<<a[j][i]<<endl;
				}else
				{
					cout<<"("<<i<<","<<j<<")="<<a[i][j]<<endl;
				}
			}
		}
	}
	
	return 0;
} 
/*

(2,2)=2
(3,2)=1 (2,3)=1
(7,2)=1 (2,7)=1
(8,7)=3 (7,8)=2
*/

【例4-2】解数字迷:

问题分析

(1) 枚举测试,五位数范围99999~30000。时间复杂度为 99999-30000+1=70000次。
(2) 构造式的枚举法—乘法:
A的取值:3~9
B、C的取值:0~9
构造满足条件的五位数,与A相乘,判断求解。时间复杂
度为7*10*10=700。
(3) 构造式的枚举法—除法:
D的取值:1~9
A的取值:3~9
利用DDDDDD/A求解,时间复杂度为9*7=63。

 

思考题:ACM预测:

问题分析:

甲乙丙丁四位学生取得名次4*3*2*1种可能,一共是n!种可能,但是在约束条件下只有一种可能是正确的。因此用多重循环对每种可能的情况进行遍历,当符合条件时跳出循环。

计算模型:

甲乙丙丁设为int a,b,c,d;所存数字代表名次。

(1)a可能的名次是从1到4, for(a=1;a<=4;++a)

(2)b可能的名次是从1到4,for(b=1;b<=4;++b),且不等于a的名次(b!=a),

(3)c可能的名次是从1到4,for(c=1;c<=4;++c),且不等于a,b的名次(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值