回溯法习题

回溯法练习题 目录 前言 一、菱形图案 二、牛妹的蛋糕 三、尼科彻斯定理 四、ABC + DEF = GHI 五、油田问题 六、马的遍历问题 总结 前言 回溯法:又称试探法 从问题的某一种初始状态出发,搜索从这种状态出发所能达到的所有状态,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能的状态出发,继续搜索,直到所有的“路径”(状态)都试探过为止。 一、菱形图案 问题描述: KiKi学习了循环,BoBo老师给他出了... 阅读详情

问题一

题干:

现有n种不同形状的宝石,每种n颗,共n*n颗。同一形状的n颗宝石分别具有n种不同的颜色c1,c2,…,cn中的一种颜色。欲将这n*n颗宝石排列成n行n列的一个方阵,使方阵中每一行和每一列的宝石都有n种不同的形状和n种不同颜色。是设计一个算法,计算出对于给定的n,有多少种不同的宝石排列方案。

解题思路:

首先搜索其所有的解空间,并生成解空间树,将满足条件的情况记录下来。由于要求每一行宝石的形状和颜色均不相同,因此我们可以从行开始,生成行的有效全排列,然后对刚生的位置进行列有效判定,如果成功则继续向下搜索,不成功则重新生成排列,继续判定。

具体代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
usingnamespace std;
int          used[10][10];
int          shapes[10][10];
int          colors[10][10];
set<int>  col_c[10];
set<int>  col_s[10];
int          n;
int          cnt = 0;
int dfs(int x, int y )
{
       int f = 0;
       for ( int i = y; i <= n; i++ )
       {
              swap( shapes[x][i], shapes[x][y]);
              if ( col_s[y].count( shapes[x][y]) == 0 )
              {
                     col_s[y].insert(shapes[x][y] );
                     for ( int j = y; j <= n;j++ )
                     {
                            swap( colors[x][j],colors[x][y] );
                            if ( col_c[y].count(colors[x][y] ) == 0 )
                            {
                                   col_c[y].insert(colors[x][y] );
                                   if (!used[shapes[x][y]][colors[x][y]] )
                                   {
                                          used[shapes[x][y]][colors[x][y]]    = 1;
                                          f                                  = 1;
                                          if ( x== n && y == n )
                                          {
                                                 ++cnt;
                                          }else  {
                                                 if( y == n )
                                                 {
                                                        dfs(x + 1, 1 );
                                                 }else  {
                                                        dfs(x, y + 1 );
                                                 }
                                          }
                                          used[shapes[x][y]][colors[x][y]]= 0;
                                   }
                                   col_c[y].erase(colors[x][y] );
                            }
                            swap( colors[x][j],colors[x][y] );
                     }
                     col_s[y].erase(shapes[x][y] );
              }
              swap( shapes[x][i], shapes[x][y]);
       }
       return(f);
}
 
 
int main()
{
       cin >> n;
       for ( int x = 1; x <= 9; x++ )
              for ( int i = 1; i <= 9; i++ )
              {
                     shapes[x][i] = colors[x][i]= i;
              }
       dfs( 1, 1 );
       cout << "输出:" << cnt<< endl;
       return(0);
}

问题二

题干:

罗密欧与朱丽叶身处一个m×n的迷宫中。每一个方格表示迷宫中的一个房间。这 m × n 个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿 8 个方向进入未封闭的房间。罗密欧位于迷宫的(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。每改变一次前进方向算作转弯一次。请设计一个算法帮助罗密欧找出这样一条道路。

解题思路:

从入口出发,顺某一方向向前探索,若能走通,则继续往前走,并置走过的房间的F为True;否则沿原路退回F置为False,换一个方向再继续探索,直至所有房间经过完,并且到达朱丽叶所在房间。为保证在任何位置上都能沿原路退回,需要用栈保存经过路径。假设“当前位置”指的是“在搜索过程中的某一时刻所在图中某个方块位置”,则求迷宫中一条路径的算法的基本思想是:若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,否则根据探索过的房间的标志位以及探索完此房间后对其他的影响来选择下一步探索的方向是当前房间的八个方向的哪个。

具体代码:

#include <iostream>
#include <stdlib.h>
using namespace std;
 
typedef struct {
       intx, y;
}Point;           //表示一迷宫坐标
 
 
void FindWay(int *path,int n,int m,Pointstart,Point end) {
       while(start.x!=end.x|| start.y!=end.y) {
              cout<<"("<<start.x<<','<<start.y<<")"<<'';
              switch(path[start.x*(m+1)+start.y]) {
                     case0:     start.x--; break;
                     case1:     start.x--; start.y++; break;
                     case2:     start.y++; break;
                     case3: start.x++; start.y++; break;
                     case4: start.x++; break;
                     case5:     start.x--; start.y--; break;
                     case6: start.y--; break;
                     case7:     start.y--; break;
                     default:cout<<"??\n"; return ;
              }
       }
       cout<<"("<<end.x<<','<<end.y<<")";
       return;
}
 
void showAll(int *path,int n,int m)
{
       for(inti=1;i<=n;++i) {
              for(int j=1;j<=m;j++) {
                     switch(path[i*(m+1)+j]){
                            case 0:     cout<<"上\t"; break;
                            case 1:     cout<<"右上\t"; break;
                            case 2:     cout<<"右\t"; break;
                            case 3: cout<<"右下\t"; break;
                            case 4: cout<<"下\t"; break;
                            case 5:     cout<<"左下\t"; break;
                            case 6: cout<<"左\t"; break;
                            case 7:     cout<<"左上\t"; break;
                            default :cout<<"无\t";break;
                     }
              }
              cout<<endl;
       }
      
      
}
 
 
class TravelMaze {
 
private:
       Pointstart,end;
       //Pointcurrent_point;
      
       intbest_num_turn;    //最少转向次数
       intnum_traved;                    //记录经过多少房间
       intcurr_num_turn;        //当前转向次数
       int*TX ;
       int*TY ;
       intn,m;
       intb;                                  //不可进房间数
       bool*maze;//迷宫
      
       int*curr_path;                     //当前解该点下一步走向 0-7 顺时针
       int*best_path;                     //最优解的该点下一步走向 0-7 顺时针
      
private:
       boolIsOK(Point current_point)
       {
              //是否到达并且最少转向最优
              if(num_traved==n*m-b-1 &&
                     current_point.x==end.x&& current_point.y==end.y)
                     if(curr_num_turn<best_num_turn)
                                   returntrue;
              return false;
       }
      
      
       voidBackTrack(Point current_point,int dir)
       {
              if(IsOK(current_point)) {
                     for(inti=1; i<=n; ++i)
                            for(int j=1; j<=m; ++j) {
                                   best_path[i*(m+1)+j]=curr_path[i*(m+1)+j];
                                   best_num_turn=curr_num_turn;
                            }
                     //showAll(best_path,n,m);
                     //FindWay(best_path,n,m,start,end);
                     //return;
              }
                           
             
              Point tmp;
              for(int i=0; i<=7; ++i)   {
                     curr_path[current_point.x*(m+1)+current_point.y]= i;
                     tmp.x= current_point.x +TX[i];
                     tmp.y= current_point.y +TY[i];
                     //是否在迷宫内
                     if(tmp.x<=0||tmp.y<=0||tmp.x>n||tmp.y>m)
                            continue;
                     //是否已经经过
                     if(!maze[tmp.x*(m+1)+tmp.y]){
                            maze[tmp.x*(m+1)+tmp.y] = true;
                            //if(current_point.x==1&¤t_point.y==3&&num_traved==3)
                            //     cout<<"a:"<<i<<endl;
                            if(i!=dir) ++curr_num_turn; //是否转向
                            ++num_traved;
                            BackTrack(tmp,i);
                            --num_traved;
                            if(i!=dir) --curr_num_turn;
                            curr_path[current_point.x*(m+1)+current_point.y]= -1;
                            maze[tmp.x*(m+1)+tmp.y] = false;
                     }
              }
      }    
      
public:
       intSolve(int n_,int m_,Point bb[],int b_,Point start_,Point end_,int *path)
       {
              n = n_;                         //n行
              m = m_;                       //m 列
              b = b_;                         //不可进房间数
              start = start_;         //开式位置
              end = end_;                  //结束位置
              best_num_turn = n*m+1;          //最少转向次数
           num_traved = 1;                          //记录经过多少房间
              curr_num_turn = 0;
              maze = new bool [(n+1)*(m+1)];
              for(int i=1;i<=n;i++)
                     for(intj=1;j<=m;++j)
                            maze[i*(m+1)+j] = false;
              curr_path = new int [(n+1)*(m+1)];
              best_path = path;
             
              TX = new int[8];
              TY = new int[8];
              int tx[] = {-1,-1,0,1,1,1,0,-1};
              int ty[] = {0,1,1,1,0,-1,-1,-1};
              for(int i=0;i<=7;++i) {
                     TX[i]=tx[i];
                     TY[i]=ty[i];
              }
              for(int i=0;i<b;++i)maze[bb[i].x*(m+1)+bb[i].y] = true;
              maze[start.x*(m+1)+start.y] = true;
              BackTrack(start_,-1);
             
              delete[] TX;
              delete[] TY;
              delete[] maze;
              delete[] curr_path;
              return best_num_turn;
       }
};
 
 
 
int main()
{
      
       intn = 3,m=3;
       Pointa[4];
       a[0].x= 1;a[0].y = 2;
       a[1].x= 3;a[1].y = 7;
       a[2].x= 5;a[2].y = 5;
       a[3].x= 8;a[3].y = 2;
       intpath[(n+1)*(m+1)];
       Pointstart,end;
       start.x= start.y = 1;
       end.x= end.y = 3;
      
       TravelMazetm;
       intleast=tm.Solve(n,m,a,0,start,end,path) ;
       cout<<"最少转向"<<least<<endl<<"Path\n";
      
       //FindWay(path,n,m,start,end);
       showAll(path,n,m);
       cin.get();
       return 0;
}

问题三

题干:

石油传输网络通常可表示为一个非循环带权的有向图G.G中有一个称为源的顶点s,石油从顶点输送到G中其他顶点,图G中每条边的权表示该边连接的2个顶点间的距离,网络中的油压随距离的增大而减小,为保证整个输油网络的正常工作,需要维持网络的最低油压Pmin,为此需要在网络的某处或全部顶点处设置增压器,在设置增压器的顶点处油压可以升至Pmax,油压从Pmax减到Pmin可使石油传输的距离至少为d,试设计一个算法,计算网络中增压器的最优设置方案,使得用最少增压器保证石油运输的畅通。

解题思路:

使用回溯法,每个节点单独作为树的一层,左叉为1表示设置增压器,右叉为0表示不设置增压器。每当遍历到叶子节点时判断能否保证石油运输的畅通。

具体代码:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n;
int mx;
struct node
{
	int x; int y;
};
vector<node> que[100];
bool set[100];
void dfs(int x, int k);
void traceback(int x)//运用二叉树结构,深度优先遍历
{
	if (x == n)//如果遍历到叶子结点
	{
		dfs(1,mx);
	}
	else
	{
		set[x] = 1;//给当前点设置增压器
		traceback(x + 1);
		if (x != 1)//第一个结点相当于固定有设置增压器的
		{
			set[x] = 0;//不设置增压器
			traceback(x + 1);
		}
	}
}
int num = 0;
int ss = 0;
int ans = n;
bool answer[100];
void dfs(int x,int k)//遍历所有路径,看是否通畅
{
	num++;
	if (num == n)//遍历了所有结点即表示通畅
	{
		if (ss < ans)//如果当前增压器数量比之前的少
		{
			ans = ss;
			for (int i = 1; i <= n; i++)//记录当前答案
			{
				answer[i] = set[i];
			}
		}
	}
	int m = que[x].size();
	for (int i = 0; i < m; i++)//遍历当前结点的所有子节点
	{
		if (set[x] == 1)//如果当前结点有增压器
		{
			ss++;//增压器计数
			if(mx-que[x][i].y>=0)//如果可以到达下一个结点
			dfs(que[x][i].x, mx - que[x][i].y);
		}
		else//如果当前结点没有增压器
		{
			if(k - que[x][i].y>=0)//如果可以到达下一个结点
			dfs(que[x][i].x, k - que[x][i].y);
		}
	}
}
int main()
{
	
	cin >> n>>k;
	for (int i = 1; i <= n; i++)
	{
		int m;
		cin >> m;
		for (int j = 1; j <= m; j++)
		{
			int a, b;
			cin >> a >> b;
			if (a > i)
			{
				que[i].push_back({ a,b });
			}
		}
	}
	cout << ans - 1 << endl;
	for (int i = 1; i <= n; i++)
	{
		cout << answer[i] << endl;
	}
}

回溯法习题总结 回溯(深度优先搜索) 文章目录回溯(深度优先搜索)题目一:组合总和解法一:回溯解法二:动态规划题目二 题目一:组合总和 解法一:回溯 class Solution { public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { //传入待选数组和目标值 sort(candidates.begin(),candidates.end());//将待查询的数组 阅读详情

相关推荐

困难的串(Krypton Factor, UVa 129)- 回溯法习题

题目 题目参考网址:https://vjudge.net/problem/UVA-129 大意: 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的 串”。例如,BB、ABCDACABCAB、ABCDABCD都是容易的串,而D、DC、ABDAB、 CBABCBA都是困难的串。 输入正整数n和L,输出由前L个字符组成的、字典序第k小的困难的串。例如,当L=3 时,前7个困难的串分别为A、AB、ABA、ABAC、ABACA、ABACAB、ABACABA。输入 保证答案不超过80个字

KKWriedy的博客 444

【算法分析】回溯法详解+范例+习题解答

以深度优先方式搜索问题解的算法【回溯法是优化的暴力遍历,即一棵树在特定条件作为剪枝函数,树可以提前截掉,省去一些子节点。完全暴力遍历则是需要全部叶子节点都考虑】回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法(1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构; (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索

司六米希的博客 2346

记录Nvidia AGX Orin的配置日常(二)设置上电自动开机和远程桌面

因为要拿AGX作为机器人的主控板,所以需要给他设置一下通电后无需按电源键就自动开机,然后再配置一下远程桌面。

AutomaticForever的博客 1361

回溯算法部落卫队问题c语言,第5章节-回溯法-习题.ppt

第5章节-回溯法-习题课程安排 第5章 回溯法习题课 第5章 回溯法习题 子集和问题 最小长度电路板排列问题 最小重量机器设计问题 运动员最佳匹配问题 无分隔符字典问题 无和集问题 n色方柱问题 整数变换问题 拉丁矩阵问题 排列宝石问题 重复拉丁矩阵问题 罗密欧与朱丽叶的迷宫问题 工作分配问题 独立钻石跳棋问题 智力拼图问题 布线问题 最佳调度问题 无优先级运算问题 世界名画陈列馆问题 世界名...

weixin_39921224的博客 1040

实战案例:用多智能体系统模拟房地产市场的架构设计

房地产市场是典型的复杂自适应系统:买方纠结“要不要上车”、卖方盘算“挂多少钱能快速成交”、中介忙着“撮合两边赚佣金”、政府琢磨“怎么调政策稳房价”——每一个参与者的微小决策,最终都会汇聚成“房价暴涨”“成交冰点”这样的宏观现象。传统的计量经济学模型(比如线性回归)假设“所有人都是理性人”,但现实中没人能算清所有变量——你可能因为“同事买了学区房”就跟风,也可能因为“怕失业”而放弃买房。这时候,多智能体系统(MAS)

移动开发前沿的博客 1122

PCIe扫盲(三)

需要特别注意的是,PCIe的Spec中明确规定只有Root有权限发起配置请求(Originate Configuration Requests),也就是说PCIe系统里面的其他设备是不允许去配置其他设备的配置空间的,即peer-to-peer的配置请求是不允许的。当配置请求进行BDF路由的时候,正是依靠这些信息来确定要找的设备的。前面的文章还介绍过,Root和Switch的每一个端口中都包含一个P2P桥,并且知道桥的配置空间头(Configuration Space Header)是Type1型的。

Liuqz2009的专栏 2399

回溯法概念和重要习题实现

文章目录概念找所有子集题目思路代码递归非递归main01背包穷举mainn后问题题目思路代码NQueen类搜索(递归)判断有无冲突打印结果main输出结果 概念 回溯法有“通用的解题法”之称,可以系统地搜索一个问题的所有解或任一解,它是一个既带有系统性又带有跳跃性的搜索算法。 在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树,算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解 如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯; 否则,进入该子树,继续按深

qq_41571459的博客 882

安卓游戏存档修改全攻略:以《英雄迷宫冒险》为例(附避坑指南)

本文详细介绍了安卓游戏存档修改的全过程,以《英雄迷宫冒险》为例,涵盖基础认知、工具选择、实战修改及风险控制。通过十六进制编辑和UTF-8编码解析,玩家可以修改金钱、角色属性和物品数量等数据,同时提供了避坑指南和伦理考量,帮助玩家在享受修改乐趣的同时保持游戏体验的平衡。

weixin_29209801的博客 392

回溯法的一个习题

题目如下:按照原理,编程实现1□2□3□4□5□6□7□8□9□10=100。在□中插入+或-,不插入则表示连接,使得最终运算结果等100 做这个题,自己用了栈+回溯法。题目虽然挺简单,但是实现起来,还是出了不少错误。不多说,附代码: 1 #include <iostream> 2 using namespace std; 3 4 #de...

weixin_30950237的博客 548

基于Arduino的智能垃圾桶

通过本次简单的Arduino智能垃圾桶小实验可以快速了解Arduino的基本用法 1、材料准备 Arduino UNO HC-SR04超声波模块 SG90舵机 杜邦线 电源 电脑 2、代码分析 电机的控制 #include<Servo.h> #define duoji D5 Servo myduoji; void setup() { myduoji.attach(duoji); //舵机连接 Serial.begin(115200); } void loop() { myduoji.w

weixin_41679960的博客 1万+

Disk Drill 使用教程

Disk Drill只需单击几下,即可恢复USB闪存驱动器上已删除的数据,包括丢失的照片,文档和其他文件类型。Disk Drill是真正的多合一应用程序,可在Mac上恢复闪存驱动器。Disk Drill将自动应用最佳的笔式驱动器恢复算法来恢复Mac数据。 USB闪存驱动器是一种传输和存储信息的好方法,但是如果错误地丢失或删除了存储在其中的文件,会发生什么呢?当您需要Mac的闪存驱动器数据恢复软件时,Disk Drill是您的最佳选择。Disk Drill将扫描您的USB闪存驱动器(也称为笔式驱动器)并查找

zjj778899的博客 1万+

c语言最短加法链问题回溯法,《回溯法习题》PPT课件.ppt

1,课程安排,第5章 回溯法习题课,3,第5章 回溯法习题,子集和问题 最小长度电路板排列问题 最小重量机器设计问题 运动员最佳匹配问题 无分隔符字典问题 无和集问题 n色方柱问题 整数变换问题 拉丁矩阵问题 排列宝石问题 重复拉丁矩阵问题 罗密欧与朱丽叶的迷宫问题 工作分配问题 独立钻石跳棋问题 智力拼图问题 布线问题 最佳调度问题 无优先级运算问题,世界名画陈列馆问题 世界名画陈列馆问题(不重...

weixin_28908857的博客 764

MATLAB随机生成m个三维坐标点,且各个坐标点之间的距离不小于n

randi函数 randi(max,m,n); %生成均匀分布的随机整数,max生成的随机整数最大值,生成m行n列的矩阵 编写函数sampling function [x,y,z]=sampling(lowx,upx,lowy,upy,lowz,upz,m,n) %该函数用来产生不重复的随机整数矩阵 %low—随机整数下界;up—随机整数上界;m—坐标点个数;n—各个坐标点之间的最小距离 %编...

qq_45384561的博客 9436

算法设计与分析第五章——回溯法课后习题

另外在展示答案代码之前我还有一种想法,我们以每行为一层深度,因为如果某形状某颜色被某格[i][j]选取之后,那么整个i行j列都不能有该形状和该颜色,我们不妨每行的n格看作n次循环,每次我们选取后cc[a[i][j]][b[i][j]]=1,比如现在是cc[1][1]=1,也就是第1行第1格为1。假设男1配女2,即P[1][2]*Q[2][1]不一定是最大的,因为P[1][2]和P[2][1]是不一样的,因此我们还需要交换次序比较P[2][1]*Q[1][2]的大小。既然要遍历矩阵,那么最好是逐行遍历。

milu_ELK的博客 1519

华为数字化转型之道 方法篇 第五章 视IT为投资,用产品思维管理IT

比较传统信息化和数字化转型下的IT系统特征,我们发现业务环境、IT能力、业务和IT的关系都发生了巨大的变化(见图5-1)从“管理系统”到“作业平台”。企业通常的做法是将线下的文档、流程线上化,IT系统是作为管理系统而存在的。而面向数字化,企业的业务作业、业务运营和决策、团队协同等业务动作已经和IT系统集成,IT系统逐步转变为作业系统。从“功能优先”到“体验优先”,如果要整体完成一项工作往往需要用户在不同系统间切换,费时费力。

沧海之巅的专栏 1093

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

leetcode刷题总结之回溯法

前言: 好久没写总结了,总感觉心里空空的。回溯法是看labuladong的详解回溯法入的门,然后看了《计算机算法设计与分析》第5章的回溯法部分弄清了原理,今日总结一下,供以后复习用。 回溯法的定义: 回溯法有通用解法的美称,对于很多问题,如迷宫等都有很好的效果。回溯法实际就是对问题的解空间树采用深度优先搜索的方式,搜索需要解决问题的任一解或者所有解,它是一个既带系统性又带跳跃性的搜索算法。 回...

algsup 3955

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

算法设计与分析第五章 (回溯法)课后习题答案(c++)

​该文章是算法设计与分析(第二版)中各章的课后习题 主编 : 李春葆 在本文中,主要是对该书第五章-回溯法章节中的上机实验题以及在线编程题进行代码解答。 代码运行环境是:DEVc++

qq_46664080的博客 2435

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【C/C++练习题】回溯法判断矩阵中的路径

《剑指Offer》面试题12:矩阵中的路径

本末实验室 1120

括号生成(Leetcode-22)- 回溯法习题

题目 原题连接:https://leetcode-cn.com/problems/generate-parentheses 看回溯法列表时候发现中间有个22没做,强迫症不能忍!! 知识点 DFS 回溯法 思路 题目是括号生成,单单进行暴力枚举不满足的情况挺多的(虽然好在题目范围n只有1-8,也算能做)。我们思考一下回溯的剪枝条件,只有在左括号数量小于右括号数目的时候才有意义,不然的话生成的括号必然存在... ()) ...,不满足条件,所以对上述情况进行剪枝。 总的来说: 左括号在数量小

KKWriedy的博客 187

【Java习题程序】用非递归栈,回溯法,解决迷宫问题

题目: 最後有完整代碼。 思路: 定义现在所在位置点的信息,包括所在位置、上下左右是否可走。然后按先上后下先左后右尝试走下一步,走完之后把点位信息存入栈,然后继续初始化下一点的信息,如此轮回,当走到死路的时候 出栈回退,一直回退到有下一条出路的点位,继续走下去。 胜利判断方法:当栈顶元素 位置为地图右下角时 ,代表成功了。 当走到...

懂技术的猫 1302

程序基本算法习题解析 回溯法求解图的m可着色判定问题

题目: 给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的两个顶点着不同颜色。 思路: 首先,需要输入的数据为:顶点数N,颜色数M,邻接矩阵adjMatrix(二维,表示顶点之间的关系,两点间有边相连为1,无边相连为0)。然后依次对各顶点进行着色,对每个顶点的着色规则是:从标号较小的颜色数开始尝试,每选定一种颜色,判断该顶点是否...

elma_tww的博客 1823

回溯法采用的搜索策略_算法设计与分析复习题最终版 -

一、填空题:1、 算法就是一组有穷的_____________,它们规定了解决某一特定类型问题的一系列运算。2、 f(n)= 6×2+n,f(n)的渐进上界是_____________。 3、 递归与分治算法应满足条件:____________与_____________。 4、 算法的复杂性是______的度量,是评价算法优劣的重要依据。5、 以广度优先搜索或以最小耗费方式搜索问题解的算法称为_...

weixin_39736547的博客 1032

组合(Leetcode-77)- 回溯法习题

题目 原题连接:https://leetcode-cn.com/problems/combinations/ 知识点 DFS 回溯 + 剪枝 思路 如果使用暴力递归,时间上是一定超时的(O(nn)),因此只能去回溯法+剪枝 剪枝策略:其实就是去避免无效的重复,如 [1,2] 和 [2,1],我们只需要每次在枚举的时候不再取前面的元素即可避免上述的重复(代码中start_num表示下一个开始元素,Line 12 for (int i = start_num; i <= nums; i+

KKWriedy的博客 133

子集(Leetcode-78)- 回溯法习题

题目 原题连接:https://leetcode-cn.com/problems/subsets/ 知识点 DFS 回溯 + 剪枝 思路 这道题和组合(Leetcode-77)有些类似,可以进行节点参考 这道题我首先进行了排序,为了保证每一个元素从小到大排列(为后续剪枝)。和Leetcode-77一样的思路去进行剪枝:每一次只去遍历大于当前元素的元素。 例如 [1,2,3,4], 对于2元素开始,只遍历:[2],[2,3],[2,3,4] 对于3开始的元素,只遍历:[3],[3,4] 这道

KKWriedy的博客 127

算法设计与分析实验报告-回溯法

算法设计与分析实验报告-回溯法。掌握回溯法的基本思想;掌握回溯法的算法框架;掌握回溯法的基本应用。​LeetCode22.括号生成,​LeetCode17.电话号码的字母组合。

m0_51657509的博客 964
上一篇: 动态规划——三角剖分问题
下一篇: 贪心算法习题
Zephyr .
博客等级 码龄5年 29粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值