每日一题 POJ-2251前戏 简单搜索 BFS和DBFS

【编程】X*Y的网格迷宫 X*Y的网格迷宫 1、质朴版 在NxM的方格中,以左上角格子为起点,右下角格子为终点,每次只能向下走或者向右走,请问一共有多少种不同的走法给定两个正整数int n,int m,请返回走法数目。 分析 1、解答:我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(n,n)(坐标系的单位长度为小方格的变长) 用f(i,...... 阅读详情

思考过程:三维数组???

BFS(广度优先遍历)的扩展。先写一个二维的练练手

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

const int maxn = 100;

struct Node {
	int x, y;
	int step;
}S,T,node;

int n, m;
char maze[maxn][maxn];
bool inq[maxn][maxn] = { false };
int x[4] = { 0,0,1,-1 };
int y[4] = { 1,-1,0,0 };

bool test(int x, int y) {
	if (x > n || x<0 || y>m || y < 0)
		return false;
	if (maze[x][y] == '*')
		return false;
	if (inq[x][y] == true)   //如果已经走过
		return false;
	return true;
};

int BFS() {
	queue<Node> q;
	S.step = 0;
	inq[S.x][S.y] = true;
	q.push(S);

	while (!q.empty()) {
		Node top = q.front();
		q.pop();
		if (top.x == T.x && top.y == T.y)
			return top.step;
		for (int i = 0; i < 4; i++) {
			int newX = top.x + x[i];
			int newY = top.y + y[i];
			if (test(newX, newY)) {
				node.x = newX;
				node.y = newY;
				node.step = top.step + 1;
				q.push(node);
				inq[newX][newY] = true;
			}
		}
	}
	return -1;
}

int main()
{
	cin >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		getchar();
		for (int j = 0; j < m; ++j)
		{
			maze[i][j] = getchar();
		}
	}
	cin >> S.x >> S.y >> T.x >> T.y;
	printf("%d\n", BFS());
	return 0;
}

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

2 2 4 3

11

理解BFS的一个好图 -- 我的简单理解队列 就是将上下左右依次放入队列,出的的时候也是依次的 ,每个方向的扩展都是不相打扰的

DBFS就是双向广度搜索,即从终点和起点都开始BFS,他们两个相遇的时候就行了。但是因为双向会出现多种相遇的情况,这时不能直接输出,而是检查完该层所有的节点以得到最优解,即交替逐层搜索。也即如果这层搜索遇到了另一个已经访问过的,那么已经搜索过的层次就是答案了,可以跳出来了,以后不会出现更优的了,而当某一边队列空时就无解了。

HDOJ-1372

简述:棋盘横坐标a~h,纵坐标1~8,马走日,问起点到终点的最小步数

//DBF
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;
struct position {
	int x;
	int y;
};
char c[6];
int a[6];
position dir[8] = { {-2,1},{-2,-1},{1,-2},{-1,-2},{2,1},{2,-1},{1,2},{-1,2} };
queue<int> que;
int vis[9][9];
int ans;
bool is_right(int x, int y) {
	if (x > 0 && x < 8 && y>0 && y < 8)
		return true;
	return false;
};
int BFS() {
	int row, col, i;
	ans = 0;
	que.push(a[0]);
	que.push(a[1]);
	que.push(ans);
	vis[a[0]][a[1]] = 1;
	while (!que.empty()) {
		row = que.front();  que.pop();
		col = que.front();  que.pop();
		ans = que.front();  que.pop();
		if (row == a[2] && col== a[3])
			return ans;
		for (i = 0; i < 8; i++) {
			if (is_right(row + dir[i].x, col + dir[i].y) && !vis[row + dir[i].x][col + dir[i].y]) {
				que.push(row + dir[i].x);
				que.push(col + dir[i].y);
				que.push(ans + 1);
				vis[row + dir[i].x][col + dir[i].y] = 1;
			}
		}
	}
	return 0;
}

int main()
{
	while (gets_s(c)) {
		while (!que.empty())
			que.pop();
		memset(vis, 0, sizeof(vis));
		a[0] = c[0] - 'a' + 1;
		a[1] = c[1] - '0';
		a[2] = c[3] - 'a' + 1;
		a[3] = c[4] - '0';
		ans = BFS();
		cout << ans<<endl;
	}
	return 0;
}

http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx

https://blog.youkuaiyun.com/qq_41759198/article/details/81510147

//DBFS
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;
struct position {
	int x;
	int y;
};
char c[6];
int a[6];
position dir[8] = { {-2,1},{-2,-1},{1,-2},{-1,-2},{2,1},{2,-1},{1,2},{-1,2} };
queue<int> que1,que2;
int vis[9][9];
int ans,ans1,ans2,cnt;
bool flag;
bool is_right(int x, int y) {
	if (x > 0 && x < 8 && y>0 && y < 8)
		return true;
	return false;
};
int From_Head_BFS() {
	int row, col, i,step;
	row = que1.front();  que1.pop();
	col = que1.front();  que1.pop();
	step = que1.front();  que1.pop();
		for (i = 0; i < 8; i++) {
			if (is_right(row + dir[i].x, col + dir[i].y) && vis[row + dir[i].x][col + dir[i].y]!=1) {
				ans1 = step + 1;
				if (vis[row + dir[i].x][col + dir[i].y] == 2) {
					flag = false;
					ans = ans1 + ans2;
					return 0;
				}
				que1.push(row + dir[i].x);
				que1.push(col + dir[i].y);
				que1.push(ans1);
				vis[row + dir[i].x][col + dir[i].y] = 1;
			}
		}
	
	return 0;
}
int From_Tail_BFS() {
	int row, col, i,step;
	row = que2.front();  que2.pop();
	col = que2.front();  que2.pop();
	step = que2.front();  que2.pop();
	for (i = 0; i < 8; i++) {
		if (is_right(row + dir[i].x, col + dir[i].y) && vis[row + dir[i].x][col + dir[i].y] != 1) {
			ans2 = step + 1;
		    if (vis[row + dir[i].x][col + dir[i].y] == 1) {
				flag = false;
				ans = ans1 + ans2;
				return 0;
			}
		    que2.push(row + dir[i].x);
			que2.push(col + dir[i].y);
			que2.push(ans2);
			vis[row + dir[i].x][col + dir[i].y] = 2;
		}
	}
	return 0;
}

int main()
{
	while (gets_s(c)) {
		while (!que1.empty())
			que1.pop();
		while (!que2.empty())
			que2.pop();
		memset(vis, 0, sizeof(vis));
		a[0] = c[0] - 'a' + 1;
		a[1] = c[1] - '0';
		a[2] = c[3] - 'a' + 1;
		a[3] = c[4] - '0';
		ans = ans1 = ans2 = 0;
		int step = 0;
		flag = true;
		que1.push(a[0]);
		que1.push(a[1]);
		que1.push(step);
		vis[a[0]][a[1]] = 1;

		que2.push(a[2]);
		que2.push(a[3]);
		que2.push(step);
		vis[a[2]][a[3]] = 2;
		if (a[0] == a[2] && a[1] == a[3])
			return ans;
		else {
			while (flag) {
				cnt = que1.size();//该层的节点数,逐层执行
				while (cnt-- && flag)
					From_Head_BFS();
				cnt = que2.size();
				while (cnt-- && flag) {
					From_Head_BFS();
				}
			}
			cout << ans << endl;
		}
		
	}
	return 0;
}

HDOJ-1728

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<queue>

using namespace std;
const int maxz = 100;
int m, n;
char  a[maxz][maxz];
int used[maxz][maxz];
int k, sy, sx, ex, ey;
struct node {
	int x;
	int y;
};
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };


int judge(int x, int y)
{
	return x >= 0 && x < n && y >= 0 && y < m && a[x][y] != '*';
}

void BFS(int x,int y) {
	queue<node> q;
	node S,next;
	S.x = x;
	S.y = y;
	q.push(S);
	bool flag = false;
	while (!q.empty()) {
		node now = q.front();
		q.pop();
		if (now.x == ex && now.y == ey) {
			if (used[ex][ey] <= k&&used[ex][ey]!=-1) {
				flag = true;
				printf("yes");
			}
			else
				break;
		}
		for (int i = 0; i < 4; i++) {
			next.x = now.x + dir[i][0];;
			next.y = now.y + dir[i][1];;
			while(judge(next.x, next.y)) {
				if (used[next.x][next.y] == -1) {
					used[next.x][next.y] = used[now.x][now.y] + 1;
					q.push(next);
				}
				//一直往一个一个方向走,走到尽头
				next.x += dir[i][0];
				next.y += dir[i][1];
			}
		}
	}
	if (!flag)
		printf("no\n");
};

int main() {
	int t;
	cin >> t;
	while (t--) {
		cin >> m >> n;
		memset(used, -1, sizeof(used));
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				cin >> a[i][j];
			}
		}
		cin >> k >> sy >> sx >> ey >> ex;
		sy--, sx--, ex--, ey--;
		BFS(sx,sy);
	}
}

 

DBFS数据编辑 本工具可以编辑DBFS文件!支持数据修改和查看等等! 立即下载

相关推荐

钣金件设计规范

为保证折弯 强度,钣金折弯钣金应大于材料的最小折弯半径。在设计U型弯曲件时,两弯曲边最好长度相等,以免弯曲时产品偏 移而产生废品,如果因为结构设计不允许两边一样长,为保证产品在模 具中准确定位,应预先在设计时添加工艺定位孔,特别是多次折弯成 形的零件,必须设计工艺孔为定位基准,以减少累计误差,保证产品 质量,如图2-11所示。凸包是依靠材料的延伸使钣金件形成局部凹陷或凸起的冲压工序凸包与拉深是完全不同的冲压工艺,凸包中材料厚度的改变为费意图性 的,即厚度的少量改变是变形过程中形成的,不是设计指定的要求。

制冷技术咨询与服务的博客 7326

求解迷宫问题

问题描述 有一 8×8的迷宫图,其中O表示通路方块,X表示障碍方块。假设入口位置为 (0,0),出口为右下角方块位置 (7,7)。设计一个程序求指定入口到出口的一条迷宫路径。 输入描述 8行,每行8个字符表示迷宫。 输入保证至少存在一条合法路径。 输出描述 8行,每行8个字符,空格表示所选路径。 样例输入 Copy to Clipboard OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO ...

Recursions的博客 1616

ThinkBook 16p 2024 BIOS降压定频实战:从解锁CFG Lock到AC Loadline调优

高性能笔记本在满载时频繁撞上温度墙,通常源于固件层默认电压冗余过大,而系统级降压工具又受限于CFG Lock锁定。要根治问题,需要从BIOS固件层面理解电压管理机制——AC/DC Loadline参数控制着CPU在不同负载下的电压请求,通过修改这些负载线值可以安全降低电压,解锁CFG Lock后还能让XTU、ThrottleStop等软件调参工具恢复可用。这种BIOS级调优在工程实践中广泛用于改善散热、稳定频率、压降风扇噪音,尤其适用于联想ThinkBook 16p 2024与拯救者Y9000P等采用HX平

weixin_32496547的博客 388

《算法设计与分析》之蛮力法

《算法设计与分析》之蛮力法

qq_60587708的博客 3217

SoapUI 5.0 模拟WebService接口实战:从WSDL文件到Mock服务端完整流程

本文详细介绍了如何使用SoapUI 5.0模拟WebService接口,从解析WSDL文件到搭建完整的Mock服务端流程。通过实战案例和效率技巧,帮助开发者快速掌握接口模拟技术,提升开发与测试效率。

weixin_26833139的博客 407

YOLOv11 模型剪枝实战:深入解析通道剪枝与层剪枝的策略与实现(含环境配置、微调技巧与部署测试)

YOLOv11模型剪枝技术通过移除冗余参数和结构来压缩模型,主要包括通道剪枝和层剪枝两种方法。通道剪枝通过评估批量归一化层的缩放因子γ确定通道重要性,移除不重要的特征通道;层剪枝则直接删除整个网络层或模块。剪枝流程包括评估重要性、移除冗余成分、微调模型和评估性能四个步骤。该技术可显著降低模型计算量和参数量,适合在资源受限设备上部署高性能目标检测模型。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1960

八数码问题:bfs及dbfs版本详解

hdu1043多组数据 poj1077单组数据 1、对于空间的处理 按常规方法,标志位序列vis的大小需要876543210位,空间非常大,所以我们考虑将int转化为char 类型储存(32位机int占4字节 char 占1字节)。 又考虑,如果转化为九进制,876543210(9)-->381367044(10),进一步优化空间。 可是像111111111,333333333这样...

weixin_30924239的博客 398

Apollo Planning2.0决策规划算法代码详细解析 (1):环境搭建

1、官方提供连接:git clone https://github.com/ApolloAuto/application-pnc.git。此外,也更新了dreamview对pnc的支持,使得调试更加方便。apollo开源团队近期更新了planning版本,对代码进行了一定程度上的重构。(2)进入docker,并编译整个工程:./apollo.sh build_dbg。下载项目环境后使用aem进行环境配置;2、有一定基础建议直接拉取最新代码,自己手动进行编译。(1)环境安装: ./dev_start.sh。

自动驾驶Player的博客 1840

dbFS计算

#include #include #include int main(int argc, char ** argv) { long double val = 0;//功率相对值 long double pwr = 0;//化为dbFS值 int i; for (i = 1; i < argc; i++)//系统默认第一个参数为程序名CalcPwr.exe { val =

西门吹雪博客 2万+

【AUTOSAR OS】调度表管理模块深度解析

本文深入解析AUTOSAR OS调度表的实现机制。调度表通过预定义到期点序列控制任务激活时序,支持周期性执行、多核协同和容错处理。核心数据结构包括调度表控制块(STCB)、配置结构和到期点动作。关键函数涵盖初始化、启动、到期点处理及链表管理,采用O(n)时间复杂度。以发动机控制为例展示配置与使用方式,并探讨显式同步、时间容错等高级特性。最后提出EP数量控制、链表优化等性能建议,为汽车ECU时间触发系统开发提供参考。

1605

C++经典面试题100例及答案

答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类。答:这样可以提高编译效率,因为分开的话只需要编译一次生成对应的.obj文件后,再次应用该类的地方,这个类就不会被再次编译,从而大大的提高了编译效率。答:这种函数会自动为内联函数,这种函数在函数调用的地方在编译阶段都会进行代码替换。答:常对象是指在任何场合都不能对其成员的值进行修改的对象。答:所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。

usstmiracle的博客 3万+

4.4.4求解迷宫问题

问题描述: 有如下8*8的迷宫图: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO 其中,O表示通路方块,X表示障碍方块。假设入口是位置(0,0),出口为右下角方块位置(7,7)。设计一个程序采用递归方法求指定入口到出口的一条迷宫路径 问题求解: 用n表示迷宫大小,二维数组Maze存放迷宫...

qq_43192537的博客 3584

【AUTOSAR-DCM】-3.1-将CDD导入CFG并查看$22服务配置变化(UDS诊断DID带一个Data)

案例背景:(共8页精讲) 在《【UDS诊断描述文件CDD】-3.2-编辑CDD给$22服务创建一个带一个Data的DID(dataIdentifier)数据标识符》中,适应使用CANdela Studio在CDD中创建一个带一个Data的DID(dataIdentifier)数据标识符,见图0-1。现在我们将该CDD文件导入到CFG(DaVinci Configurator),看看配置会发生哪些变化。 图0-1 目录 1 将诊断描述文件CDD导入CFG(DaVinci Configurator.

「汽车电子助手」的博客 1633

【算法】贪心求解仓库设置位置问题(C++源码)

问题描述 城市街道如下图所示,所有街道都是水平或垂直分布,假设水平和垂直方向均有m+1条,任何两个相邻位置之间的距离为1。在街道的十字路口有n个商店,下图中的n=3,m=8,3个商店的坐标位置分别是(2,4),(5,3),(6,6)。现在,需要在某个路口位置建立一个合用的仓库。若仓库位置为(3,5),那么这3个商店到仓库的路程(只能沿着街道行进)总长度最少是10。设计一个算法找到仓库的最佳位置,使得所有商店到仓库的总路程最短。 步骤描述 定义一个judge函数找minpath,包含三个点的横纵坐标,在8*8

敲代码两年半的练习生博客 2829

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

dbfs 实施文档

一、DBFS介绍 The Oracle Database File System (DBFS) creates a standard file system interface on top of files and directories that are stored indata base tables. DBFS is similar to NFS in that i...

数据库天地 652

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

双向广搜(DBFS)

双向广搜很早之前就像学习,但蒟蒻这道今天才会写(汗。。。) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Lcomyn的专栏 3553

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

蛮力法 —— 求解迷宫问题 —— DFS和BFS

求解迷宫问题 问题描述: 有如图8×8的迷宫 OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOOOOXOO XXXXXXXO 其中,O表示通路方块,X表示障碍方块。 假设入口位置为(0,0)出口为右下角方块位置(7,7)设计一个程序求指定入口到出口的一条迷宫路径。 分析 用n表示迷宫大小,用二维数组Maze存放迷宫,从(x,y)方块可以试探上、下、左、右4个方位。假设总是按从方位0到方位3的顺序试探,各方位对应的水平方向偏移量H[4]={0,1,0,-1}、垂直

gl620321的博客 3919

关于dbfs原理 相对于bfs的复杂度优化及应用

(关于dbfs,A*,迭代加深及idA*的学习借鉴于北大暑假ACM课) dbfs即双向广搜,从起点终点同时bfs,直到两个bfs有了交点,就找到了答案。 dbfs对单向bfs在搜索广度上有明显的减少,在时间及空间复杂度上都有极大的优化。 举例: 假设1个结点能扩展出n个结点,单向搜索要m层能找到答案,那 么扩展出来的节点数目就是: (1-n^ m)/(1-n) 而dbfs节点数目为2 ...

weixin_30675967的博客 286

uva 1601 dbfs搜索

#include using namespace std; const int maxn = 16 + 10, maxm = 192 + 10; int cx[] = { -1, 1, 0, 0, 0}, cy[] = {0, 0, -1, 1, 0}, w, h, n, cnt; int id[maxn][maxn], G[maxm][5], st[3], ed[3], edge[maxm],

Tczxw的专栏 558

简单迷宫的实现-------------找一条通路

#include&lt;iostream&gt; #include&lt;assert.h&gt; #include&lt;stack&gt; using namespace std; //求解路径的基本思想:1.如果当前路径能够通过,将当前路经进行压栈,为了回退(回溯法),并将走过的路标记成2 不能走1,0可以走 //2.如果当前路径上下左右都不能通过,则出栈(回溯)并且将当前路径标为3 即...

baidu_37964044的博客 840

双向广搜 DBFS

双向广搜 DBFS 双向:简而言之就是从起点(正向搜索)和终点(逆向搜索)同时开始搜索,当两个搜索产生的一个子状态相同时就结束搜索。 通常有两种实现方法: 1、用一个队列来储存子状态,起点和终点先后入队,正向搜索和逆向搜索交替进行,两个方向的搜索交替扩展子状态。直到两个方向的搜索产生相同的子状态结束。 2、两个方向的搜索虽然是交替扩展子状态的。但是两个方向生成的子状态的速度不一定平衡。所以,可以每次选择子状态数较少的那个方向先进行扩展。这样就不会出现两个方向生成子状态的速度的不平衡,可以明显的提高效率哦。

GitHub:https://github.com/myp020301 441

POJ 2157 Maze

Maze Time Limit:2000MS Memory Limit:65536K Total Submissions:3183 Accepted:996 Description Acm, a treasure-explorer, is exploring again. This time he is in a specia...

weixin_30588907的博客 213

poj 1077 hdu 1043 Eight 八数码问题 DBFS(双向广度优先搜索)a*算法 康拓展开

一,八数码问题简介 编号为1到8的8个正方形滑块被摆成3行3列(有一个格子留空),可以每次把与空格相邻(有公共边)的滑块移动到空格中,而它原来的位置就成了新的空格。给定局面,计算出从当前状态移动到目标状态的最少步数。如将八数码从左到有从上到下的数字列出来,没有空格用0表示(其实也可以用9表示),可以表示为: 2 6 4 1 3 7 0 5 8 -> 8 1 5 7 3 6 4 0 2 在这里我们

gwq5210的专栏 1853

oracle 11.2.0.2创建DBFS

由于最近需要在项目中使用到外部表加DBFS的方式加载数据,所以需要创建DBFS 在此记录下创建的过程和遇到的问题 1、安装fuse oracle enterprise linux 5.5的光盘中,在Server目录下找到fuse相关的rpm,安装相应fuse软件包 2、配置fuse(下面操作不知道有什么用,只是按照文档上操作) /sbin/depmod /sbin/modprobe f

chenrizhong的专栏 2815

【数据结构】迷宫问题求解(链栈,DFS)

1.问题描述: 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 2.基本要求: (1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。 (2)编写递归形式的算法...

Chen_yuazzy的博客 1万+
上一篇: 每日一题 最大子矩阵 动态规划问题
下一篇: 每日一题 POJ-2251 三维迷宫
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值