首页 > 编程语言 >算法笔记之图论

算法笔记之图论

时间:2024-01-17 22:47:19浏览次数:24  
标签:current 图论 数字 int 笔记 旋转 deadends 算法 拨轮

打开转盘锁

你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为 '0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。

锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。

列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。

字符串 target 代表可以解锁的数字,你需要给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回 -1 。

这个问题是一个典型的搜索问题,可以使用广度优先搜索(BFS)来解决。每一步都是通过旋转拨轮产生新的锁状态,然后判断是否到达目标状态。在搜索过程中,需要避开死亡数字(deadends)。

class Solution {
public:
	int openLock(vector<string>& deadends, string target) {
		unordered_set<string> deadSet(deadends.begin(), deadends.end());
		unordered_set<string> visited;

		queue<string> q;
		q.push("0000");
		visited.insert("0000");

		int steps = 0;

		while (!q.empty()) {
			int size = q.size();
			for (int i = 0; i < size; ++i) {
				string current = q.front();
				q.pop();

				if (current == target) {
					return steps;
				}

				if (deadSet.find(current) != deadSet.end()) {
					continue;
				}

				// 生成新的状态
				for (int j = 0; j < 4; ++j) {
					for (int k = -1; k <= 1; k += 2) {
						string next = current;
						next[j] = (next[j] - '0' + k + 10) % 10 + '0';

						if (visited.find(next) == visited.end()) {
							q.push(next);
							visited.insert(next);
						}
					}
				}
			}

			++steps;
		}

		return -1; // 无法解锁
	}
};

标签:current,图论,数字,int,笔记,旋转,deadends,算法,拨轮
From: https://www.cnblogs.com/stuBoo/p/17971365

相关文章

  • 人工智能第三版阅读笔记:第一章
    人工智能:第一章本章展示了人工智能的概貌,包括人工智能的定义、分类、发展、学科、应用以及方法。使读者了解了人工智能领域的一些基本概念,并对该学科的内容有了大致的了解。人工智能概述人工:非自然形成的、人造的。智能:R.斯腾伯格的定义--智能是个体从经验中学习、正确推理、......
  • gateway笔记
    自定义断言新增一个Bean标记为@Component、继承AbstractRoutePredicateFactory类命名需要以RoutePredicateFactory结尾声明一个静态内部类来接受配置文件中的信息重写shortcutFieldOrder来映射配置文件中的参数重写apply方法下面是一个根据请求头和时间来决定......
  • 搜索学习笔记+杂题 (进阶二 dfs/bfs的进阶)
    前言:由于搜索的题还是做的太少了,所以以后有可能会不定期更新。四、还是进阶的dfs/bfs相关题单:戳我1、dfs(1)meetinthemiddleP2962[USACO09NOV]LightsG颠覆了我对折半搜索的认知,果然,只要满足了折半搜索的几个性质,基本上都可以使用折半搜索来处理。首先我们拿到的是一张......
  • 算法笔记
    1.回溯法(Backtracking)应用:组合、排列、子集等组合型问题,0/1背包问题、图的着色问题等。时空复杂度:时空复杂度较高,指数级别。时间复杂度:O(2^n)或更高,其中n是问题规模。空间复杂度:O(n)或更高,取决于递归深度。特性:通过深度优先搜索遍历解空间。需要撤销选择,回溯到上一步......
  • 学习笔记——ST算法
    ST算法ST算法是一种运用倍增来解决RMQ问题也就是区间最值问题的算法。给定一个长度为\(N\)的序列\(A\),ST算法能在\(\mathcalO(NlogN)\)的时间预处理后,以\(\mathcalO(1)\)的时间在线回答区间最值问题。设\(F_{i,j}\)表示序列\(A\)中下标在子区间\(\left[i,......
  • 学习笔记——线段树
    线段树(SegmentTree)1.建树首先我们要明白线段树中的每个节点都代表一个区间,而对于线段树中的每个内部节点\(\left[l,r\right]\),它的左子节点是\(\left[l,mid\right]\),右子节点是\(\left[mid+1,r\right]\),其中\(mid=(l+r)/2\)(向下取整)。然后我们可以让根节点的编号为\(......
  • Stack-array based implementation【1月17日学习笔记】
    点击查看代码//Stack-arraybasedimplementation#include<iostream>usingnamespacestd;#defineMAX_SIZE101intA[MAX_SIZE];//globleinttop=-1;//globlevoidpush(intx){ if(top==MAX_SIZE-1){ cout<<"error:stackoverflow"&l......
  • 算法—前缀和
    1.一维前缀和S[i]=a[1]+a[2]+...a[i]//求s[n]a[l]+...+a[r]=S[r]-S[l-1]//求l-r的序列和2.二维前缀和S[i,j]=s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];第i行j列格子左上部分所有元素的和以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和为:S[......
  • Numpy学习笔记
    1、创建数组直接创建数组np.array([1,2,3,4])创建指定形状和内容的数组numpy.zeros(shape,dtype=float,order='C')numpy.ones(shape,dtype=float,order='C')numpy.empty(shape,dtype=float,order='C')参数描述shape数组形状dtype数据类......
  • Doubly linked list【1月17日学习笔记】
    点击查看代码//Doublylinkedlist#include<iostream>usingnamespacestd;structnode{ intdata; node*next; node*prev;};//定义双向链表结构体node*A;node*getnewnode(intx){ node*temp=newnode; temp->data=x; temp->prev=NULL; temp->nex......