图论之dfs与bfs的练习

dfs--深度优选搜索

bfs--广度优先搜索

迷宫问题--dfs

问题:

给定一个n*m的二维迷宫数组其中S是起点,T是终点,*是墙壁(无法通过), .是道路
问从起点S出发沿着上下左右四个方向走,能否走到T点?能输出"YES",否则输出"NO"。


8 8


*****...
*.S...**
*****.**
*****..*
*T..**.*
.**.**.*
..*....*
...*****

#include<iostream>
using namespace std;
const int N = 1e4 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
int n, m;
int sx, sy, tx, ty;
bool flag;
void dfs(int px, int py) {
	//如果当前搜的点p是终点点t,终止搜索
	if (px == tx && py == ty) {
		flag = true;
		return;
	}
	//沿着点p的邻接点继续搜索
	for (int i = 0; i < 4; i++) {
		int bx=px+dx[i], by=py+dy[i];//生成邻接点
		if (bx<1 || bx>n || by<1 || by>m) continue;//迷宫图的边界
		if (g[bx][by] == '*') continue;//墙壁
		if (vis[bx][by]) continue;//走过的不再走
		vis[bx][by] = 1;
		dfs(bx, by);
	
	}
}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> g[i][j];
			if (g[i][j] == 'S') sx = i, sy = j;//找到起点的坐标
			if (g[i][j] == 'T') tx = i, ty = j;//找到终点的坐标
		}
	}
	vis[sx][sy] = 1;
	flag = false;
	dfs(sx, sy);
	if (flag) cout << "YES" << endl;
	else cout << "NO" << endl;
	return 0;
}

求迷宫问题的最短路--bfs

问题:

给定一个n*m的二维迷宫数组其中S是起点,T是终点,*是墙壁(无法通过), .是道路
问从起点S出发沿着上下左右四个方向走,能否走到T点?如果能打印最短路径长度,否则输出0。


8 8


*****...
*.S...**
*****.**
*****..*
*T..**.*
.**.**.*
..*....*
...*****

#include<iostream>
#include<queue>
using namespace std;
const int N = 1e4 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
int n, m;
int sx, sy, tx, ty;
struct point {
	int x, y, depth;
};
void bfs(point s) {
	queue<point> q;
	q.push(s);   vis[s.x][s.y] = 1;

	while (!q.empty()) {
		point cur = q.front();  q.pop();
		if (cur.x == tx && cur.y == ty) {
			flag = true;
			cout << cur.depth - 1 << endl;
			return;
		}
		//通过方向数组找到cur的邻接点,沿着邻接点继续广搜
		for (int i = 0; i < 4; i++) {
			int bx = cur.x + dx[i], by = cur.y + dy[i];//生成邻接点
			if (bx<1 || bx>n || by<1 || by>m) continue;
			if (g[bx][by] == '*') continue;
			if (vis[bx][by]) continue;
			vis[bx][by] = 1;
			q.push({ bx,by,cur.depth + 1 });
		}
	}
}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> g[i][j];
			if (g[i][j] == 'S') sx = i, sy = j;
			if (g[i][j] == 'T') tx = i, ty = j;
		}
	}
	vis[sx][sy] = 1;
	flag = false;
	bfs({ sx, sy ,1});
	return 0;
}

1215:迷宫

 

信息学奥赛一本通(C++版)在线评测系统

【题目描述】

一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n�×�的格点组成,每个格点只有22种状态,.#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。

【输入】

第1行是测试数据的组数k�,后面跟着k�组输入。每组测试数据的第11行是一个正整数n(1≤n≤100)�(1≤�≤100),表示迷宫的规模是n×n�×�的。接下来是一个n×n�×�的矩阵,矩阵中的元素为.或者#。再接下来一行是44个整数ha,la,hb,lbℎ�,��,ℎ�,��,描述A处在第haℎ�行, 第la��列,B处在第hbℎ�行, 第lb��列。注意到ha,la,hb,lbℎ�,��,ℎ�,��全部是从00开始计数的。

【输出】

k�行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。

【输入样例】

2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0

【输出样例】

YES
NO
解法一:dfs
#include<iostream>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//标记数组
int t,n, sx, sy, tx, ty;
//方向数组
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
bool flag;
void dfs(int px, int py) {
	if (px == tx && py == ty) {
		flag = true;
		return;
	}
	//沿着邻接点继续搜索
	for (int i = 0; i < 4; i++) {
		int bx = px + dx[i], by = py + dy[i];
		if (bx<1 || bx>n || by<1 || by>n) continue;
		if (g[bx][by] == '#') continue;
		if (vis[bx][by]) continue;
		//如果以上情况均不成立,证明邻接点有效,沿着该邻接点继续深搜
		vis[bx][by] = 1;//不标记会报栈溢出错误
		dfs(bx, by);
	}
}
int main() {
	cin >> t;
	while (t--) {
		cin >> n;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				cin >> g[i][j];  
		cin >> sx >> sy >> tx >> ty;
		sx++, sy++, tx++, ty++;//注意:本题下标从0开始
		//多组数据要将相关状态重置
		flag = false;
		memset(vis, 0, sizeof vis);//将vis数组全体清0
		vis[sx][sy] = 1;
		dfs(sx, sy);
		if (flag) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}
 解法二:bfs
#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//标记数组
int t, n, sx, sy, tx, ty;
//方向数组
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
bool flag;
struct point {
	int x, y;
};
void bfs(point p) {
	queue<point> q;
	q.push(p);  vis[p.x][p.y] = 1;

	while (!q.empty()) {
		point cur=q.front();  q.pop();
		if (cur.x == tx && cur.y== ty) {
			flag = true;
			return;
		}
		//沿着邻接点继续搜索
		for (int i = 0; i < 4; i++) {
			int bx = cur.x + dx[i], by = cur.y + dy[i];
			if (bx<1 || bx>n || by<1 || by>n) continue;
			if (g[bx][by] == '#') continue;
			if (vis[bx][by]) continue;
			//如果以上情况均不成立,证明邻接点有效,沿着该邻接点继续深搜
			vis[bx][by] = 1;
			q.push({ bx,by });
		}
	}
}
int main() {
	cin >> t;
	while (t--) {
		cin >> n;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				cin >> g[i][j];   /*scanf(" %c", &g[i][j]); */
		cin >> sx >> sy >> tx >> ty;
		sx++, sy++, tx++, ty++;//注意本题下标从0开始
		//多组数据要将相关状态重置
		flag = false;
		memset(vis, 0, sizeof vis);//将vis数组全体清0
		vis[sx][sy] = 1;
		bfs({sx, sy});
		if (flag) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}

1216:红与黑

【题目描述】

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

【输入】

包括多组数据。每组数据的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下:

1)‘.’:黑色的瓷砖;

2)‘#’:红色的瓷砖;

3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每组数据中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

【输出】

对每组数据,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

【输入样例】

6 9 
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0

【输出样例】

45
解法一:dfs
#include<iostream>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
int sx, sy;
int w, h;
int cnt;
void dfs(int px,int py)
{
	//沿着邻接点搜索
	for (int i = 0; i < 4; i++)
	{
		int bx = px + dx[i], by = py + dy[i];
		if (g[bx][by] == '#')continue;
		if (bx<1 || bx>w || by<1 || by>h)continue;
		if (vis[bx][by])continue;
		vis[bx][by] = 1;
		cnt++;
		dfs(bx, by);
	}
}

int main()
{
	/*注意:本题是先输入列再输入行*/
	while (cin >> h >> w && w && h)//注意要判断w和h都为0结束
	{
		for (int i = 1; i <= w; i++)
		{
			for (int j = 1; j <= h; j++)
			{
				cin >> g[i][j];
				if (g[i][j] == '@')
					sx = i, sy = j;
			}

		}
		//多组数据注意相关状态
		cnt = 1;
		memset(vis, 0, sizeof vis);//vis数组全体清0
		vis[sx][sy] = 1;
		dfs(sx, sy);
		cout << cnt << endl;
	}
	
	return 0;
}
 解法二:bfs
#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
int sx, sy;
int w, h;
int cnt;
struct point
{
	int x, y;
};
void dfs(point s)
{
	queue<point>q;
	q.push(s); vis[s.x][s.y] = 1;
	while (!q.empty()) 
	{
		point cur = q.front(); q.pop();
		//沿着邻接点搜索
		for (int i = 0; i < 4; i++)
		{
			int bx = cur.x + dx[i], by = cur.y + dy[i];
			if (g[bx][by] == '#')continue;
			if (bx<1 || bx>w || by<1 || by>h)continue;
			if (vis[bx][by])continue;
			vis[bx][by] = 1;
			cnt++;
			q.push({bx,by});
		}
	}
}

int main()
{
	/*注意:本题是先输入列再输入行*/
	while (cin >> h >> w && w && h)//注意要判断w和h都为0结束
	{
		for (int i = 1; i <= w; i++)
		{
			for (int j = 1; j <= h; j++)
			{
				cin >> g[i][j];
				if (g[i][j] == '@')
					sx = i, sy = j;
			}

		}
		//多组数据注意相关状态
		cnt = 1;
		memset(vis, 0, sizeof vis);//vis数组全体清0
		vis[sx][sy] = 1;
		dfs({ sx, sy });
		cout << cnt << endl;
	}
	
	return 0;
}

1219:马走日--dfs

注意:本题需要用到回溯算法,故只能用深度优先搜索

【题目描述】

马在中国象棋以日字形规则移动。

请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

【输入】

第一行为整数T(T < 10),表示测试数据组数。

每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10)。

【输出】

每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。

【输入样例】

1
5 4 0 0

【输出样例】

32
#include<iostream>
using namespace std;
const int N = 1e2 + 10;
int g[N][N];//迷宫数组
bool vis[N][N];//二维标记数组
//方向数组--八个方向
int dx[] = { 1,1,-1,-1,2,2,-2,-2 };
int dy[] = { 2,-2,2,-2,1,-1,1,-1};
int t; int n, m,sx,sy;
int cnt;
void dfs(int px, int py, int depth)
{
	if (depth == n * m)//按照此时的搜索方案已经搜完整个棋盘了
	{
		cnt++;
		return;
	}
	for (int i = 0; i < 8; i++)/*注意:八个方向*/
	{
		int bx = px + dx[i], by = py + dy[i];
		if (vis[bx][by])continue;
		if (bx<1 || bx>n || by<1 || by>m)continue;
		vis[bx][by] = 1;
		dfs(bx, by,depth+1);
		//回溯
		vis[bx][by] = 0;
	}

}
int main()
{
	cin >> t;
	while (t--)
	{
		cin >> n >> m;
		//多组数据相关状态清空
		cnt =0;
		cin >> sx >> sy;
		sx++, sy++;
		memset(vis, 0, sizeof vis);
		vis[sx][sy] = 1;
		dfs(sx, sy,1);//起点是第一层,最后应该走到n*m层结束
		cout << cnt << endl;
	}
	return 0;
}

 1212:LETTERS--dfs

【题目描述】

给出一个row×col���×���的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。

【输入】

第一行,输入字母矩阵行数R�和列数S�,1≤R,S≤201≤�,�≤20。

接着输出R�行S�列字母矩阵。

【输出】

最多能走过的不同字母的个数。

【输入样例】

3 6
HFDFFB
AJHGDH
DGAGEH

【输出样例】

6
#include<iostream>
using namespace std;
char g[N][N];
bool vis[N];
int dx[] = { 1,-1,0,0};
int dy[] = { 0,0,1,-1};
int n, m;
int ans = 0;
void dfs(int px,int py,int depth)
{
	ans = max(ans, depth);//选取经过字母数最多的
	for (int i = 0; i < 4; i++)
	{
		int bx = px + dx[i], by = py + dy[i];
		if (vis[g[bx][by]])continue;
		if (bx<1 || bx>n || by<1 || by>m) continue;
		vis[g[bx][by]] = 1;
		dfs(bx, by, depth + 1);
		vis[g[bx][by]] =0;//回溯
	}
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> g[i][j];
		}
	}
	vis[g[1][1]] = 1;
	dfs(1,1,1);
	cout << ans;
	return 0;
}

求最短路径

1251:仙岛求药--bfs

【题目描述】

少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。

下图 显示了一个迷阵的样例及李逍遥找到仙药的路线。

【输入】

输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:

1)‘@’:少年李逍遥所在的位置;

2)‘.’:可以安全通行的方格;

3)‘#’:有怪物的方格;

4)‘*’:仙药所在位置。

当在一行中读入的是两个零时,表示输入结束。

【输出】

对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。

【输入样例】

8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###
6 5
.*.#.
.#...
..##.
.....
.#...
....@
9 6

.#..#.
.#.*.#
.####.
..#...
..#...
..#...
..#...
#.@.##
.#..#.
0 0

【输出样例】

10
8
-1

#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
int n, m,sx,sy,tx,ty;
char g[N][N];
bool vis[N][N];
int ans = -1;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
struct point { int x, y, depth; };
void bfs(point p) {
	queue<point> q;
	q.push(p);  vis[p.x][p.y] = 1;
	while (!q.empty()) {
		point cur = q.front(); q.pop();
		if (cur.x == tx && cur.y == ty) {
			ans= cur.depth - 1;
			return;
		}
		for (int i = 0; i < 4; i++) {
			int bx = cur.x + dx[i], by = cur.y + dy[i];
			if (bx<1 || bx>n || by<1 || by>m) continue;
			if (vis[bx][by]) continue;
			if (g[bx][by] == '#') continue;
			vis[bx][by] = 1;
			q.push({ bx,by,cur.depth + 1 });
		}
	}
}
int main() {
	while (cin >> n >> m && n && m) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				cin >> g[i][j];
				if (g[i][j] == '@') sx = i, sy = j;
				if (g[i][j] == '*') tx = i, ty = j;
			}
		}
		ans = -1;
		memset(vis, 0, sizeof vis);
		bfs({ sx,sy,1 });
		cout << ans << endl;
	}
	return 0;
}

1330:【例8.3】最少步数--bfs

【题目描述】

在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100×100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。

【输入】

A、B两点的坐标。

【输出】

最少步数。

【输入样例】

12 16
18 10

【输出样例】

8
9
#include<iostream>
#include<queue>
const int N = 1e2 + 10;
char g[N][N];
bool vis[N][N];
int dx[] = {1,1,-1,-1,2,2,-2,-2,2,2,-2,-2};
int dy[] = {2,-2,2,-2,1,-1,1,-1,2,-2,2,-2};
int n, m;
int sx, sy;
int ans;
struct point
{
	int x, y,depth;
};
void bfs(point s)
{
	queue<point>q;
	q.push(s); vis[s.x][s.y] = 1;
	while (!q.empty())
	{
		point cur = q.front(); q.pop();
		if (cur.x == 1 && cur.y == 1)
		{
			ans=cur.depth - 1 ;
			return;
		}
		for (int i = 0; i < 12; i++)
		{
			int bx = cur.x + dx[i], by = cur.y + dy[i];
			if (bx<1 || bx>100 || by<1 || by>100)continue;
			if (vis[bx][by])continue;//注意,搜索时也不能搜0
			vis[bx][by] = 1;
			q.push({ bx, by,cur.depth+1});
		}
	}
}

int main()
{
	int t = 2;
	while (t--)
	{
		ans = 0;
		cin >> sx>>sy;
		memset(vis, 0, sizeof vis);
		bfs({ sx, sy ,1});
		cout << ans<<endl;
	}
	return 0;
}

1255:迷宫问题--bfs

【题目描述】

定义一个二维数组:

int maze[5][5] = {
0,1,0,0,0,
0,1,0,1,0,
0,0,0,0,0,
0,1,1,1,0,
0,0,0,1,0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

【输入】

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

【输出】

左上角到右下角的最短路径,格式如样例所示。

【输入样例】

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

【输出样例】

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

  

#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
char g[N][N];
bool vis[N][N];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
struct point
{
	int x, y;
};
point path[N][N];
void bfs(point s)
{
	queue<point>q;
	q.push(s); vis[s.x][s.y] = 1;
	while (!q.empty())
	{
		point cur = q.front(); q.pop();
		if (cur.x == 5 && cur.y == 5)return;
		for (int i = 0; i < 4; i++)
		{
			int bx = cur.x + dx[i], by = cur.y + dy[i];
			if (bx < 1 || bx>5 || by < 1 || by>5)continue;
			if (g[bx][by] == '1')continue;
			if (vis[bx][by])continue;
			vis[bx][by] = 1;
			path[bx][by] = cur;
			q.push({bx, by});
		}
	}
}
void print(int px,int py)
{
	if (px == 0 && py == 0)return;
	print(path[px][py].x, path[px][py].y);
	printf("(%d, %d)\n", px-1, py-1);
}
int main()
{
	for (int i = 1; i <= 5; i++)
		for (int j = 1; j <= 5; j++)
			cin >> g[i][j];
	bfs({1,1});
	print(5,5);
	return 0;
}

1257:Knight Moves

【题目描述】

输入n�代表有个n×n�×�的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。

【输入】

首先输入一个n�,表示测试样例的个数。

每个测试样例有三行。

第一行是棋盘的大小L(4≤L≤300)�(4≤�≤300);

第二行和第三行分别表示马的起始位置和目标位置(0..L−1)(0..�−1)。

【输出】

马移动的最小步数,起始位置和目标位置相同时输出00。

【输入样例】

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

【输出样例】

5
28
0
#include<iostream>
#include<queue>
//#include<Windows.h>//动画演示
using namespace std;
const int N = 3e2 + 10;
char g[N][N];
bool vis[N][N];
int dx[] = {1,1,2,2,-1,-1,-2,-2};
int dy[] = {2,-2,1,-1,2,-2,1,-1};
int t;
int n,sx, sy, tx, ty;
int ans;
struct point { int x; int y; int depth; };
void dfs(point s)
{
	queue<point>q;
	q.push(s); vis[s.x][s.y] = 1;
	while (!q.empty())
	{
		point cur = q.front(); q.pop();
		if (cur.x == tx && cur.y == ty)
		{
			ans = cur.depth-1;
			return;
		}
		for (int i = 0; i < 8; i++)
		{
			int bx = cur.x + dx[i], by = cur.y + dy[i];
			if (bx<1 || bx> n || by<1 || by>n) continue;
			if (vis[bx][by]) continue;
			vis[bx][by] = 1;
			
			q.push({ bx, by,cur.depth+1 });
		}
	}
	
}

int main()
{
	cin >> t;
	while (t--)
	{
		cin >> n;
		cin >> sx >> sy >> tx >> ty;
		sx++, sy++,tx++, ty++;
		ans = 0;
		memset(vis, 0, sizeof vis);
		dfs({ sx, sy,1 });
		cout << ans<<endl;
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/394431.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应用管理中心架构的设计与实现

应用管理中心在现代软件开发中扮演着重要角色&#xff0c;它能够帮助开发团队有效管理和监控各种应用的运行情况。本文将介绍如何设计和实现一个高效、可靠的应用管理中心架构&#xff0c;以提升开发团队的工作效率和系统稳定性。 1. 架构概述 - 介绍应用管理中心的整体架构…

机器人革命:从斯坦福的通用操作接口到OpenAI的Sora,塑造未来的合成学习

引言 在机器人成为平凡工匠和前沿先驱的时代&#xff0c;我们正站在新黎明的边缘。本文将探讨斯坦福大学的通用操作接口&#xff08;UMI&#xff09;及其与OpenAI的Sora如何共同推进机器人技术&#xff0c;开创未来学习的新纪元。 正文 斯坦福的通用操作接口&#xff08;UMI…

jvm、jre、jdk的关系

jvm Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 字节码的虚拟机。 jre JRE&#xff08;Java Runtime Environment&#xff09; 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合&#xff0c;主要包括 Java 虚拟机&#xff08;JVM&#xff09;、J…

H12-821_130

130.如图所示&#xff0c;R1与R2组成一个VRRP备份组1&#xff0c;通过在R1执行vrrp vrid 1 virtual-ip_______命令&#xff0c;可以使其成为IP地址拥有者&#xff0c;让R1为Master, R2为Backup 。 答案&#xff1a;192.168.1.254 注释&#xff1a; IP地址拥有者优先级是255&am…

查看 PyCharm 代码文件目录位置

查看 PyCharm 代码文件目录位置 1. Show in Files2. Copy PathReferences 1. Show in Files right click -> Show in Files / Show in Explorer 即可打开目录 2. Copy Path right click -> Copy Path 即可复制目录或文件路径 References [1] Yongqiang Cheng, http…

【Jvm】类加载机制(Class Loading Mechanism)原理及应用场景

文章目录 Jvm基本组成一.什么是JVM类的加载二.类的生命周期阶段1&#xff1a;加载阶段2&#xff1a;验证阶段3&#xff1a;准备阶段4&#xff1a;解析阶段5&#xff1a;初始化 三.类初始化时机四.类加载器1.引导类加载器&#xff08;Bootstrap Class Loader&#xff09;2.拓展类…

持久化:利用Linux PAM创建后门

目录 Linux PAM详解 使用PAM创建SSH后门密码 利用PAM记录密码 利用PAM免密登录 Linux PAM详解 PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插入的身份验证模块&#xff09;是Linux自带的一套与身份验证机制相关的库&#xff0c;可以将多种身份验证的方…

5、Linux 常用指令

一、帮助指令 1.man 指令 语法 man [命令或配置文件] //功能描述&#xff1a;获得帮助手册上的信息查看 ls 命令的帮助信息 man ls信息作用NAME命令名称SYNOPSIS如何使用命令DESCRIPTION描述命令SEE ALSO相关的手册 2.help 指令 语法 help [命令] //功能描述&#xff1a;获得…

elementui 中 el-date-picker 控制选择当前年之前或者之后的年份

文章目录 需求分析 需求 对 el-date-picker控件做出判断控制 分析 给 el-date-picker 组件添加 picker-options 属性&#xff0c;并绑定对应数据 pickerOptions html <el-form-item label"雨量年份&#xff1a;" prop"date"><el-date-picker …

vm centos7 docker 安装 mysql 5.7.28(2024-02-18)

centos系统版本 [rootlocalhost mysql5.7]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) docker版本 拉取指定版本镜像 docker pull mysql:5.7.28 docker images 创建挂载目录&#xff08;数据存储在centos的磁盘上&#xff09; mkdir -p /app/softwa…

保护您的数据:如何应对.mallab勒索病毒的数据加密?

导言&#xff1a; 数据安全已经成为企业和个人都必须高度重视的问题。然而&#xff0c;网络犯罪分子的不断进化使得数据安全变得更加严峻。其中一种常见的威胁是勒索软件&#xff0c;而.dataru勒索病毒就是其中之一。本文将介绍.dataru勒索病毒的特征&#xff0c;以及如何恢复…

java实现排序算法(上)

排序算法 冒泡排序 时间和空间复杂度 要点 每轮冒泡不断地比较比较相邻的两个元素,如果它们是逆序的,则需要交换它们的位置下一轮冒泡,可以调整未排序的右边界,减少不必要比较 代码 public static int[] test(int[] array) {// 外层循环控制遍历次数for (int i 0; i <…

【DDD】学习笔记-领域服务

聚合的三个问题 按照面向对象设计原则&#xff0c;需要将“数据与行为封装在一起”&#xff0c;避免将领域模型对象设计为贫血对象。如此一来&#xff0c;聚合内的实体与值对象承担了与其数据相关的领域行为逻辑。聚合满足了领域概念的完整性、独立性与不变量&#xff0c;体现…

小白水平理解面试经典题目LeetCode 1025 Divisor Game【动态规划】

1025 除数游戏 小艾 和 小鲍 轮流玩游戏&#xff0c;小艾首先开始。 最初&#xff0c;黑板上有一个数字 n 。在每个玩家的回合中&#xff0c;该玩家做出的动作包括&#xff1a; 选择任意 x&#xff0c;使 0 < x < n 和 n % x 0 。将黑板上的数字 n 替换为 n - x 。 此…

【HarmonyOS】【DevEco ohpm ERROR: NOTFOUND package “@ohos/hypium“如何解决

参考 &#xff1a;&#xff08;无效&#xff09; 华为开发者论坛 DevEco创建项目时的错误解决_6 月 优质更文活动_路北路陈_InfoQ写作社区 解决&#xff1a; HormonyOS-DevEco Studio新建空项目ERROR解决_oh_modules\ohos\hypium-CSDN博客 将 .ohpm文件夹中的hypium文件夹复…

如何引导llm为自己写prompt生成剧本

如何使用写prompt让你自己生一个狗血修仙穿越短剧&#xff0c;且短剧有趣生动让人流连忘返 好的&#xff0c;我会尝试编写一个狗血修仙穿越短剧的prompt&#xff0c;以激发你的想象力&#xff0c;让你创作出一个既有趣又生动的短剧。以下是我的prompt&#xff1a; 标题&#x…

gem5学习(23):经典缓存——Classic Caches

目录 一、Interconnects 1、Crossbars 二、Debugging 默认缓存是一个带有MSHR&#xff08;未命中状态保持寄存器&#xff09;和WB&#xff08;写缓冲区&#xff09;的非阻塞缓存&#xff0c;用于读取和写入未命中。缓存还可以启用预取&#xff08;通常在最后一级缓存中&…

java.sql.SQLException: No operations allowed after statement closed.

背景 某天下午&#xff0c;客服反馈线上服务出现问题&#xff0c;不能分配了。于是我登录到系统上&#xff0c;进行同样的操作发现也不行。当然同时我已经登录到服务器打开了日志&#xff0c;发现报错了&#xff0c;下面就是日志的错误信息&#xff1a; java.sql.SQLExceptio…

Swagger-的使用

Swagger-的使用 前言效果1、相关依赖2、相关注解2.1 Tag设置整个类的名称和详情2.2 Operation描述具体的方法2.3 Parameter 描述参数2.4Schema 为属性添加注释 3、Docket配置3.1通过gropeediopenapi进行分组3.2 通过docsOpenApi设置 前言 在我们和前端进行交互的时候&#xff…

ChatGPT高效提问—prompt实践(白领助手)

ChatGPT高效提问—prompt实践&#xff08;白领助手&#xff09; ​ 随着社会的不断发展&#xff0c;白领的比例越来越高。白领的工作通常较为繁忙&#xff0c;需要管理复杂的项目。工作量大、要求高、任务紧急&#xff0c;时间分配不当部分可能导致工作效率低下&#xff0c;任…