【算法设计与分析】第七至十一讲实验

这篇具有很好参考价值的文章主要介绍了【算法设计与分析】第七至十一讲实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 7:

1. 实验题目

给定一个非负整数的数组,每个数字表示在当前位置的基础上最多可以走的步数。求能够到达数组最后一个位置所需的最少移动次数。如果不能到达,则输出-1。

例如:

       输入数组 [2,3,1,1,4],输出2——第一步从下标0移动1步到下标1,再移动3步到最后一个位置。

       输入数组 [3,2,1,0,4],不能到达,输出-1——无论怎么移动都只能到下标为3的位置,在此位置最多只能移动0步,故永远无法到达最后位置。

2. 实验目的

    掌握贪心法的设计思想并能熟练运用。

3. 实验要求

    设计贪心算法求解。输出最小移动次数,如果不能到达,则输出-1。

#include <iostream>
using namespace std;

int Greedy(int x[], int length);

int main()
{

    int length;
    int x[1000];
    cin >> length;

    for (int i = 0; i < length; i++)
    {
		cin >> x[i];
    }

    cout << Greedy(x, length) << endl;

    return 0;
}

int max(int a, int b) {
    if (a >= b)
        return a;
    return b;
}

int Greedy(int x[], int length) {
int end=length-1,steps=0,k=0,i;
    for(i=0;i<length-1;i++){
        if(i<=k && i+x[i]>k){
            k = i+x[i];
        }
    }
    if(k<length-1){
    	steps=-1;
    	return steps;
	}
    else{
    	while(end>0){
		    for(i=0;i<end;i++){
			    if(i+x[i]>=end){
				    end=i;
				    steps++;
				    break;
			    }
		    }
	    }
	    return steps;
	}
}

8: 

1. 实验题目

给定n种物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,0/1背包问题是如何选择装入背包的物品(物品不可分割),使得装入背包中物品的总价值最大?

2. 实验目的

(1)掌握回溯法的设计思想;

(2)掌握解空间树的构造方法,以及在求解过程中如何存储求解路径;

(3)考察回溯法求解问题的有效程度。

3. 实验要求

(1)对于输入的重量和价值数组,及背包容量,输出可装入的最大价值;

(2)思考可能解的表示方式及解空间树的构造;

(3)使用回溯算法完成问题求解。

#include <iostream>
#include<stdio.h>
using namespace std;

int maxValue(int w[], int v[], int length, int capacity);

int main()
{
	int length;
	int knapsack_capacity;	

	int w[1000];
	int v[1000];

	cin >> length;

	for (int i = 0; i < length; i++)
	{
		cin >> w[i];
	}
	for (int i = 0; i < length; i++)
	{
		cin >> v[i];
	}

	cin >> knapsack_capacity;

	cout << maxValue(w, v, length, knapsack_capacity);
}

int Max(int a,int b)
{
	if(a>b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

int maxValue(int w[],int v[],int length,int capacity)
{
    int dp[capacity+1],i,j,k,max=0;
    for(j=0;j<=capacity;j++)
	{
        dp[j] = 0;
    }
    for(i=0;i<length;i++)  //鍙嶅悜鏋氫妇 
	{
        for(k=capacity;k>=w[i];k--)
		{
            dp[k] = Max(dp[k],dp[k-w[i]]+v[i]);
        }
    }
    for(i=0;i<=capacity;i++)
	{
        max= Max(max,dp[i]);
    }
    return max;
} 

9: 

1. 实验题目

印刷电路板将布线区域划分成n×n个方格。精确的电路布线问题要求确定连接方格a到方格b的最短布线方案。在布线时,电路只能沿着直线或直角布线,也就是不允许线路交叉。

2. 实验目的

进一步掌握分支限界法的设计思想,掌握限界函数的设计技巧。

3. 实验要求

对问题建立合理的模型,采用分支限界法求解。

4. 实现提示

(1)下图所示是一块准备布线的电路板。在布线时, 电路只能沿直线或直角布线。为了避免线路相交, 已布线的方格做了封锁标记(图中用阴影表示) , 其他线路不允许穿过被封锁的方格。

【算法设计与分析】第七至十一讲实验

(2)电路板子用一个二维数组C[n][n]表示,其中C[i][j] = 1表示被封锁(阴影),C[i][j] = 0表示未封锁;输入起点a的行列号[r0, c0]和终点b的行列号[r1, c1],要求输出从a到b的路径,用行列坐标表示,从0开始计数。

(3)用分支限界法求解电路布线问题, 从起始方格a开始作为根结点, 与起始位置a相邻且可达的方格成为可行结点, 连同从起始方格到这个方格的距离1 加入待处理结点表PT中(可用队列存储表PT)。然后, 从表PT中取出队首结点成为下一个扩展结点, 将与当前扩展结点相邻且可达的方格连同从起始方格到这个方格的距离2加入表PT中。重复上述过程, 直到达到目标方格b或表PT为空。

#include <iostream>
using namespace std;

int distance(int** c, int n, int a_row, int a_col, int b_row, int b_col);

int main()
{
	int n, a_row, a_col, b_row, b_col;
	cin >> n >> a_row >> a_col >> b_row >> b_col;

	int** c = new int*[n];
	for (int i = 0; i < n; i++)
	{
		c[i] = new int[n];
		for (int j = 0; j < n; j++)
		{
			cin>>c[i][j];
		}
	}

	cout << distance(c, n, a_row, a_col, b_row, b_col);
}
#include <climits>
using namespace std;

int** t; 
int direction[4][2]={{0,1},{0,-1},{1,0},{-1,0}};  //鍥涗釜鏂瑰悜鍋忕Щ锛寈鍜?y鐨勫潗鏍囧€煎垎鍒姞鍑?1 

int min(int& a,int& b)  //姹備簩鑰呰緝灏忓€?
{
	return a<=b ? a:b;
}

int DFS_Search(int** c,int n,int a_row,int a_col,int b_row,int b_col)  //娣卞害浼樺厛鎼滅储 
{
	if(t[a_row][a_col]>=0)
	{
	    return t[a_row][a_col];
	}
	c[a_row][a_col]=1;
	int max=INT_MAX;
	for(int i=0;i<4;i++)
	{
		int ax=a_row+direction[i][0];
		int ay=a_col+direction[i][1];
		if(ax>=0 && ax<n && ay>=0 && ay<n && c[ax][ay]==0)
		{
			if(DFS_Search(c,n,ax,ay,b_row,b_col)<INT_MAX)
			{
			    max=min(max,t[ax][ay]+1);
			} 
		}
	}
	t[a_row][a_col]=max;
	c[a_row][a_col]=0;
	return t[a_row][a_col];
}

int distance(int** c,int n,int a_row,int a_col,int b_row,int b_col)  //姹傛渶鐭窛绂?
{
	int i,j;
	if(a_row==b_row && a_col==b_col)  //鍘熷湴涓嶅姩 
	{
		return 0;
	} 
	t=new int*[n];
	for(i=0;i<n;i++)
	{
		t[i]=new int[n];
		for(j=0;j<n;j++)
		{
			t[i][j]=-1;
		}
	}
	t[b_row][b_col]=0;
	return DFS_Search(c,n,a_row,a_col,b_row,b_col);
}

10:

1. 实验题目

采用拉斯维加斯型概率算法求解八王后问题。

2. 实验目的

(1)掌握概率算法的求解思路;

(2)通过运用拉斯维加斯型概率算法体会提升算法效率的设计过程。

3. 实验要求

(1)设计求解八王后问题的算法,使用拉斯维加斯型概率算法提升效率;

(2)将求解结果用二维数组表示,并观测求解时间,需尽力使性能达到最优;

(3)阅读已给出的代码,程序以cout输出的结果作为判断,正确输出1,错误输出0,在空白处填入函数Queen()的实现代码。

#include <iostream>
#include<vector>
using namespace std;

bool chess[8][8] = {
	{0,0,0,0,0,0,0,0},		
	{0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0},
};

void Queen();

int main()
{
	Queen();

	vector<int> x;
	vector<int> y;
	for (int m = 0; m < 8; m++)
	{
		for (int n = 0; n < 8; n++)
		{
			if (chess[m][n])
			{
				x.push_back(m);
				y.push_back(n);
			}
		}
	}

	if (x.size() != 8 || y.size() != 8)
	{
		cout << false;
		return 0;
	}

	for (int i = 0; i < 7; i++)
	{
		for (int j = i+1; j < 8; j++)
		{
			if (x[i] == x[j] || y[i] == y[j] || x[i] - x[j] == y[i] - y[j] || x[i] - x[j] == y[j] - y[i])
			{
				cout << false;
				return 0;
			}
		}
	}

	cout << true;
	return 0;
}

int x[8]={0};

bool position(int i,int x[])  //鍒ゆ柇鏄惁鍙斁缃?
{
    int j,k;
    for(j=0;j<i;j++)
	{
        if(x[i]==x[j]||abs(x[i]-x[j])==abs(i-j))  //绾︽潫鏉′欢鍒ゆ柇 
		{
			return false;
		}
    }
     return true;
}

void Queen() 
{
    int i,j,flag=1;
    while(flag)
	{
        for(i=0;i<8;i++)
	    {
            x[i]=rand()%8;  //鐢熸垚0~7闅忔満鏁?
            if(position(i,x))  //鏀剧疆鎴愬姛锛岃烦杞嚦涓嬩竴涓殗鍚庢斁缃?
            {
			    continue;  //缁х画鎵ц寰幆 
			}
            else  //鎵ц澶辫触 
		    {
               break;
            }
        }
        if(i==8)
        {
		    flag=0;
		}
    }
    for(j=0;j<8;j++)
	{
        chess[j][x[j]]=1;
    }
}

11:

1. 实验题目

设计求解TSP问题的近似算法。

2. 实验目的

掌握近似算法的设计。

3. 实验要求

(1) 输入一系列平面上的点,将任意两点之间以直线相连,构成一个无向连接图。

 (2) 设计近似算法求解满足三角不等式的TSP问题,要求近似比不超过2。文章来源地址https://www.toymoban.com/news/detail-455514.html

#include <iostream>
#include <math.h>
using namespace std;

int* tsp(double* px, double* py, int length);

int main()
{
	int length;
	double optimal;

	cin >> length;
	cin >> optimal;

	double x[1000];
	double y[1000];

	for (int i = 0; i < length; i++)
	{
		cin>>x[i];
	}
	for (int i = 0; i < length; i++)
	{
		cin>>y[i];
	}

	int* path = tsp(x, y, length);
	double cost = 0;
	for (int k = 0; k < length; k++)
	{
		int a = path[k];
		int b = path[(k + 1) % length];

		double d = (x[a] - x[b])* (x[a] - x[b]) + (y[a] - y[b])*(y[a] - y[b]);
		if (d == 0)
		{
			cout << 0 << endl;
			return 0;
		}
		cost += sqrt(d);
	}
	
	if (cost > 2 * optimal)
	{
		cout << 0 << endl;
		return 0;
	}
	cout << 1 << endl;
}
int* tsp(double* px, double* py, int length){
    int* path = new int[length];     //鍒涘缓涓€涓暟缁勬潵瀛樺偍璺緞
    bool* visited = new bool[length];   //鍒涘缓涓€涓暟缁勬潵鏍囪鏄惁琚闂繃

    for (int i = 0; i < length; i++){
        visited[i] = false;      //鍒濆鍖栨墍鏈夌偣鐨勮闂姸鎬佷负鏈闂?
    }

    path[0] = 0;         //闅忔満閫夋嫨涓€涓捣鐐癸紝骞跺皢鍏舵爣璁颁负宸茬粡璁块棶
    visited[0] = true;

    for (int i = 1; i < length; i++){
        int last = path[i - 1];   //涓婁竴涓偣
        int next = -1;       //涓嬩竴涓璁块棶鐨勭偣
        double minDist = -1;      //鍒颁笅涓€涓偣鐨勬渶鐭窛绂?

        for (int j = 0; j < length; j++){
            if (!visited[j]){
                double dist = sqrt((px[last] - px[j]) * (px[last] - px[j]) + (py[last] - py[j]) * (py[last] - py[j]));
                if (minDist < 0 || dist < minDist){
                	//鎵惧埌璺濈鏈€灏忕殑鐐?
                    minDist = dist;
                    next = j;
                }
            }
        }
        path[i] = next;         //灏嗕笅涓€涓偣鍔犲叆璺緞
        visited[next] = true;   //鏍囪涓哄凡璁块棶
    }
    return path;
}

到了这里,关于【算法设计与分析】第七至十一讲实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法设计与分析 实验五图论-桥

    一、实验目的: (1)掌握图的连通性。 (2)掌握并查集的基本原理和应用。 二、问题描述: 桥的定义 在图论中,一条边被称为“桥”代表这条边一旦被删除,这张图的连通块数量会增加。等价地说,一条边是一座桥当且仅当这条边不在任何环上。一张图可以有零或多座桥

    2024年02月06日
    浏览(41)
  • 算法设计与分析实验:DFS与BFS

    目录 一、边界着色 1.1 思路一:DFS 1.2 思路二:BFS 二、课程表II 2.1 思路一:DFS 2.2 思路二:拓扑排序 三、岛屿的最大面积 3.1 具体思路 3.2 思路展示 3.3 代码实现 3.4 复杂度分析 3.5 运行结果 2024-1-31 阴 力扣第1034题 (1)具体思路: 首先,定义一个dfs函数,用于搜索和染色连通

    2024年02月21日
    浏览(35)
  • 算法设计与分析—动态规划作业二(头歌实验)

    任务描述 本关任务:计算寻宝人所能带走的宝物的最大价值。 一个寻宝人在沙漠中发现一处神秘的宝藏,宝藏中共有 n 个宝物( n 不超过 20 ),每个宝物的重量不同,价值也不同,宝物 i 的重量是 wi ,其价值为 vi 。 寻宝人所能拿走的宝物的总重量为 m ( m 不超过 50 )。请

    2024年02月06日
    浏览(74)
  • 南邮|算法分析与设计实验二 动态规划法

    目录 实验目的 实验内容 实验步骤 一、最长公共子序列 二、矩阵连乘  加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的 最长公共子序列问题 和 矩阵连乘问题 ,体会 动态规划法 和 备忘录方法 的异同。 一、用动态规划法和备忘录方法

    2024年02月01日
    浏览(45)
  • 算法设计与分析—动态规划作业一(头歌实验)

    任务描述 本关任务:求一个序列的最长上升子序列。 相关知识 最长上升子序列问题 当一个序列 Bi 满足 B1 B2 ... Bs 的时候,我们称这个序列是 上升 的。对于给定的一个序列 a1, a2, ..., aN ,我们可以在其中找到一些上升的子序列。 现在给你一个序列,请你求出其中 最长 的上

    2024年02月04日
    浏览(137)
  • 编译原理实验三:算符优先分析算法的设计与实现

    实验三 算符优先分析算法的设计与实现 一、 实验目的 根据算符优先分析法,对表达式进行语法分析,使其能够判断一个表达式是否正确。通过算符优先分析方法的实现,加深对自下而上语法分析方法的理解。 二、 实验要求 1、输入文法。可以是如下算术表达式的文法(你

    2024年02月06日
    浏览(57)
  • 中北大学算法分析与设计实验报告六(最大团问题)

    1.实验名称 实验六 回溯与分支限界算法实验 2.实验目的 题目:最大团问题 强化学生利用回溯算法和优化处理实际问题的能力。 3.训练知识点集群 (1)根据实验内容设计算法伪代码进行算法描述; (2)利用C++/C/Java等编程语言对算法伪代码进行工程化实现; (3)输入测试用

    2024年02月06日
    浏览(42)
  • 中北大学算法分析与设计实验报告三(数字旋转方阵)

    1.实验名称 实验三 分治与减治算法实验 2.实验目的 (1)掌握分治法的设计思想; (2)掌握数字旋转方阵的具体实现过程; (3)熟练掌握二维数组的使用方法; (4)在掌握的基础上编程实现数字旋转方阵的实现过程。 3.训练知识点集群 (1)根据实验内容设计算法伪代码

    2023年04月08日
    浏览(76)
  • 王红梅《算法设计与分析(第3版)》部分课后实验代码

    【教材信息】 书名:算法设计与分析(第3版) ISBN:9787302594390 作者:王红梅   【递推法:杨辉三角形】 【分治法:九连环问题】 【贪心法:田忌赛马】 【动态规划法:数塔问题】  

    2024年02月09日
    浏览(33)
  • c++学习第十一讲---文件操作

    c++中对文件操作需要包含头文件 fstream  文本文件:以ASCII码形式储存 二进制文件:以二进制文件储存(读不懂) 操作文件三大类: 读:ifstream ; 写:ofstream ; 读写:fstream 1.写文件: 步骤: (1)包含头文件:#include fstream (2)创建流对象:ofstream ofs; (3)打开文件:ofs.op

    2024年01月24日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包