NYOJ 58 最少步数(深搜DFS)

2023-12-13 20:18
文章标签 最少 dfs nyoj 步数 58

本文主要是介绍NYOJ 58 最少步数(深搜DFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最少步数(进入题目)

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 4
描述

这有一个迷宫,有0~8行和0~8列:

 1,1,1,1,1,1,1,1,1
 1,0,0,1,0,0,1,0,1
 1,0,0,1,1,0,0,0,1
 1,0,1,0,1,1,0,1,1
 1,0,0,0,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,0,0,0,1
 1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?

(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
2
3 1  5 7
3 1  6 7
样例输出
12
11


思路:

基础的的搜索题目,

两种搜索都可以。


DFS代码:

#include<cstdio>
#define MYDD 110300int sx,sy,ex,ey,ans;//起始和终点坐标,步数
int dx[4]= {-1,1,0,0};
int dy[4]= {0,0,-1,1}; //移动的方向
int map[9][9]= {1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,1,1,0,0,1,1,0,0,0,1,1,0,1,0,1,1,0,1,1,1,0,0,0,0,1,0,0,1,1,1,0,1,0,1,0,0,1,1,1,0,1,0,1,0,0,1,1,1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1};
void DFS(int x,int y,int c) {if(x==ex&&y==ey) {if(c<ans)ans=c;return ;}for(int j=0; j<4; j++) {int gx=x+dx[j];int gy=y+dy[j];if(map[gx][gy]==0&&c+1<ans) {map[gx][gy]=1;//访问过的节点置为墙DFS(gx,gy,c+1);//递归访问下一坐标map[gx][gy]=0;//	printf("************c: %d ****\n",c);}}
}int main() {int t;scanf("%d",&t);while(t--) {int c=0;//记录步数scanf("%d%d%d%d",&sx,&sy,&ex,&ey);map[sx][sy]=1;//起始坐标置为已经访问ans=MYDD;DFS(sx,sy,c);printf("%d\n",ans);map[sx][sy]=0;}return 0;
}



BFS代码:

#include<cstdio>
#include<cstring>
#include<queue>using namespace std;int map[9][9]= {1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,1,1,0,0,1,1,0,0,0,1,1,0,1,0,1,1,0,1,1,1,0,0,0,0,1,0,0,1,1,1,0,1,0,1,0,0,1,1,1,0,1,0,1,0,0,1,1,1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
};int sx,sy,ex,ey;//开始和结束的坐标
int dx[]= {0,0,-1,1};
int dy[]= {-1,1,0,0}; //四个移动方向
bool vis[9][9];//访问标记数组struct Point {int x,y,step;//坐标和步数
};int BFS() {queue<Point> q;//定义 Point 类型队列Point temp;//定义临时结构体变量用于存储开始坐标temp.x=sx;temp.y=sy;temp.step=0;q.push(temp);while(!q.empty()) {Point dd=q.front();//取出队首元素给新定义的 结构体变量q.pop();//移去队首元素if(dd.x==ex&&dd.y==ey)return dd.step;for(int j=0; j<4; j++) {temp.x=dd.x+dx[j];temp.y=dd.y+dy[j];temp.step=dd.step+1;if(!map[temp.x][temp.y]&&vis[temp.x][temp.y])q.push(temp);vis[temp.x][temp.y]=false;}}
}int main() {int t;scanf("%d",&t);while(t--) {memset(vis,true,sizeof(vis));scanf("%d%d%d%d",&sx,&sy,&ex,&ey);int ans=BFS();printf("%d\n",ans);}return 0;
}



这篇关于NYOJ 58 最少步数(深搜DFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489834

相关文章

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

ural 1149. Sinus Dances dfs

1149. Sinus Dances Time limit: 1.0 second Memory limit: 64 MB Let  An = sin(1–sin(2+sin(3–sin(4+…sin( n))…) Let  Sn = (…( A 1+ n) A 2+ n–1) A 3+…+2) An+1 For given  N print  SN Input One

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

nyoj 288 士兵杀敌(五)

一道插线问线离线版的题  复杂度O(n); 代码如下: #include<stdio.h>#include<string.h>const int M = 1000003;const int mod=10003;int num[M];int main(){int n,c,q;scanf("%d%d%d",&n,&c,&q);while(c--){int a,b,x;scan

nyoj 1037 Postscript of Tian Ji racing

一道卡贪心的题。 也算一道改编题。 此题的解法推荐为二分图的最大匹配。 首先将输入数据转换一下,然后将满足题意的一组牌建立条边,最终边的覆盖数即为 LN 最后可得的分数。 然后求出最大匹配即可。 代码如下: #include<stdio.h>#include<string.h>char card[30][5];char s[5];int map[30][30];

nyoj 1002 Trucking

同样一道改编题。 只要把题意理解了好。 简单的二分加最短路。 只要二分高度, 然后求最短路,输出满足题意的即可。 代码如下: (最短路用spfa 时间效率高) #include <iostream>#include <cstdio>#include <cstring>#include <ctime>#include <queue>using namespace st

nyoj 1072 我想回家

一道相当题目描述相当扯的题。 这道题目的描述最后说的是求出到达最后一个点的最短距离,所以输入数据最后输入的城堡的坐标是没用的。 就是先求出两点之间的距离,若不大于村落间距离,并且不大于最后的距离限制 l ,则在两点间建边。 最后任意方法求出最短路即可。 #include <iostream>#include<stdio.h>#include<vector>#include<

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu