找朋友

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。

为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。

Input

多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。

Output

若X可以到达Y的家,输出最少时间,否则输出 -1。

Sample Input

3 3
X#Y
***
#*#
3 3
X#Y
*#*
#*#

Sample Output

4
-1

Hint

Source

zmx

BFS:

挨层遍历

#include <bits/stdc++.h>
using namespace std;
struct node
{int x, y, step; // 用结构体存坐标 和 步长
};
int n, m;
char gra[16][16]; // 临接表
int cat[16][16];
/*定义方向数组*/
int gotox[4] = {0, 0, 1, -1};
int gotoy[4] = {1, -1, 0, 0};int bfs(int a, int b)
{cat[a][b] = 1;node t = {a, b, 0};queue<node> q;q.push(t);while (!q.empty()){node temp = q.front();q.pop();if (gra[temp.x][temp.y] == 'Y')return temp.step;for (int i = 0; i < 4; i++) // 遍历四个方向{node d;d.x = temp.x + gotox[i];d.y = temp.y + gotoy[i];d.step = temp.step + 1;if (d.x >= 0 && d.x < n && d.y >= 0 && d.y < m && !cat[d.x][d.y] && gra[d.x][d.y] != '#'){q.push(d);cat[d.x][d.y] = 1;}}}return -1;
}
int main()
{ios::sync_with_stdio(false);while (cin >> n >> m){int a, b;memset(cat, 0, sizeof(cat));for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> gra[i][j];if (gra[i][j] == 'X') // 找出起点{a = i;b = j;}}}cout << bfs(a, b) << endl;}return 0;
}

DFS:

对于最新发现的顶点,如果它还有以此为起点还有 未发现的边,就继续搜索下去。直到当前点的所有方向都已搜索完毕不符合条件了,就往前回溯,访问过的  点标记为0。

#include <bits/stdc++.h>
#define INF INT_MAX
using namespace std;
int n, m, ans, MIN;
char gra[16][16]; // 临接表
int cat[16][16];
/*定义方向数组*/
int gotox[4] = {0, 0, 1, -1};
int gotoy[4] = {1, -1, 0, 0};void dfs(int a, int b, int ans)
{cat[a][b] = 1;if (ans >= MIN) // 步数比已经找出的最小的 步数MIN 还有要大return;if (ans < MIN && gra[a][b] == 'Y') // 步数比最小的已经找出的 步数MIN 还要小且已经找到Y{                                  // 如果找不到Y  MIN 仍然是INFMIN = ans;return;}for (int i = 0; i < 4; i++){int x = a + gotox[i]; // 遍历四个方向的邻点int y = b + gotoy[i];if (x >= 0 && x < n && y >= 0 && y < m && !cat[x][y] && gra[x][y] != '#'){cat[x][y] = 1;dfs(x, y, ans + 1); // 符合条件 搜索 步数+1  递归搜下一点cat[x][y] = 0;      // 递归完无果  把访问过的点标记为未访问}}
}
int main()
{ios::sync_with_stdio(false);while (cin >> n >> m){int a, b;memset(cat, 0, sizeof(cat));for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> gra[i][j];if (gra[i][j] == 'X'){a = i;b = j;}}}MIN = INF;ans = 0;dfs(a, b, ans);if (MIN != INF)cout << MIN << endl;elsecout << "-1" << endl;}return 0;
}

转载于:https://www.cnblogs.com/iQXQZX/p/10258745.html

SDUTOJ2779_找朋友(BFS | | DFS双解法)相关推荐

  1. Leetcode一起攻克搜索(BFS,DFS,回溯,并查集)

    文章目录 BFS简介 DFS简介 回溯简介 并查集简介 DFS题目 690. 员工的重要性 1.dfs解法: 2.bfs算法 547.朋友圈 dfs解法 200.岛屿数量 dfs解法 417.太平洋大 ...

  2. bfs dfs 搜索入门模板题

    bfs & dfs 题目链接:https://vjudge.net/contest/404511 1.最短路(bfs) (1)一维最短路 D - Catch That Cow 题目大意: 在一 ...

  3. 在vc++里面进行图像处理的时候应该把图形放哪_图形找朋友小班教案

    图形找朋友小班教案 作为一位优秀的人民教师,时常要开展教案准备工作,编写教案助于积累教学经验,不断提高教学质量.我们该怎么去写教案呢?下面是小编收集整理的图形找朋友小班教案,欢迎大家借鉴与参考,希望对 ...

  4. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

  5. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

  6. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

    [问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...

  7. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...

  8. LeetCode 1034. 边框着色(BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给出一个二维整数网格 grid,网格中的每个值表示该位置处的网格块的颜色. 只有当两个网格块的颜色相同,而且在四个方向中任 ...

  9. 全局路径规划:图搜索算法介绍1(BFS/DFS)

    对于全局路径规划的设计,我们先要了解什么是图搜索,在此之前,要先知道什么是图: 可以看到,图有很多种,有无向图,有向图,节点之间还可以有不同的weight, 用于表述从节点与节点直接迁移的代价. 而图 ...

最新文章

  1. 下载服务器 linux系统,如何搭建Linux服务器
  2. 关于ABAP流程处理的一些命令的说明(stop,exit,return,check,reject)
  3. mysql分页查询limit_MySQL查询语句(where,group by,having,order by,limit)
  4. [CSS] 点击事件触发的动画
  5. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)
  6. 信息系统项目管理07——项目成本管理
  7. web前端职业生涯路线
  8. python接口自动化之自动发送测试报告邮件
  9. 如何用计算机设计衣服,如何用电脑设计服装
  10. 如何把flv格式转成mp4格式?
  11. Use HAProxy to load balance 300k concurrent tcp socket connections: Port Exhaustion, Keep-alive and
  12. 调用WPS服务COM组件转换PDF
  13. shell下删除文件末尾的空行
  14. 你当前无权访问该文件夹 解决你当前无权访问该文件夹拒绝你访问该文件夹
  15. ios5.1.1越狱实践
  16. 人机工程学座椅设计_办公座椅设计中人体工程学分析
  17. Unity的Application.Quit()方法使用失效的其他解决方案。
  18. linux中$符号有什么作用,linux中的“$”符号表示什么
  19. 狂刷OJ基础题两天,OJ机考成功半小时全部AC了
  20. POI生成word文档,再通过spire.doc.free 实现word转pdf

热门文章

  1. 【转】一步一步学Linq to sql(五):存储过程
  2. 写的py_ping 可以跑了
  3. 警惕黑客破坏网络安全
  4. 话里话外:转帖:制约中小企业发展三大管理问题与SaaS的成功要素
  5. mysql 1067错误,服务无法启动 进程意外终止
  6. 被忽视的 Application
  7. Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds...
  8. css( div和span)——读书笔记
  9. 有向图强连通分量的三种算法
  10. Linux日志系统-01:什么是rsyslog?