都比较简单,直接贴代码吧。

poj1979 DFS

题目大意:给你一个二维数组,.表示可以到达,#表示障碍,@表示起始位置,问你能到达的最大地点有多少个,每次只能走上下左右

#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;int n, m, sx, sy, ans;
int pd[30][30];
char maze[30][30];int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};void dfs(int x, int y)
{ans++, pd[x][y] = 1;for(int i = 0; i < 4; i++){int nx = x + dx[i], ny = y + dy[i];if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;if(pd[nx][ny] == 1 || maze[nx][ny] != '.') continue;dfs(nx, ny);}
}int main()
{while(scanf("%d%d", &n, &m) != EOF){if(n == 0 && m == 0) break;int t = n;n = m, m = t;for(int i = 0; i < n; i++)scanf("%s",maze[i]);for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)if(maze[i][j] == '@') sx = i, sy = j;ans = 0;memset(pd, 0, sizeof(pd));dfs(sx, sy);printf("%d\n", ans);}return 0;
}

View Code

poj3009 DFS

题目大意:

就是要求把一个冰壶从起点“2”用最少的步数移动到终点“3”

其中0为移动区域,1为石头区域,冰壶一旦想着某个方向运动就不会停止,也不会改变方向(想想冰壶在冰上滑动),除非冰壶撞到石头1 或者 到达终点 3

要注意:可能会出边界,边界是没有障碍物抵挡的!

#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;int n, m, sx, sy, tx, ty, ans;
int maze[30][30];
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};int dfs(int k, int x, int y)
{if(x == tx && y == ty) return k - 1;if(k > 10) return -1;int nx, ny, min = -1, res;for(int i = 0; i < 4; i++){nx = x + dx[i], ny = y + dy[i];if(nx < 0 || ny < 0 || nx > n-1 || ny > m-1 || maze[nx][ny] == 1) continue;while(1){if(nx == tx && ny == ty) return k;nx += dx[i], ny += dy[i];if(nx < 0 || ny < 0 || nx > n-1 || ny > m-1) break;if(nx == tx && ny == ty) return k;if(maze[nx][ny] == 1){maze[nx][ny] = 0;res = dfs(k + 1, nx - dx[i], ny - dy[i]);maze[nx][ny] = 1;if(min == -1) min = res;else if(res != -1 && res < min) min = res;break;}}}return min;
}int main()
{while(scanf("%d%d", &m, &n) != EOF){memset(maze, 0, sizeof(maze));if(n == 0 && m == 0) break;for(int i = 0; i < n; i++)for(int j = 0; j  < m; j++){scanf("%d", &maze[i][j]);if(maze[i][j] == 2) sx = i, sy = j, maze[i][j] = 0; if(maze[i][j] == 3) tx = i, ty = j, maze[i][j] = 0; }ans = dfs(1, sx, sy);printf("%d\n", ans);}return 0;
}

View Code

poj3669 BFS

题目大意:

给定几个坐标,在这些坐标上 t 时刻会有陨石雨。

怎样在最短的时间内找到一个安全的地方。

方法:预处理,把每个坐标有陨石的地方预处理出来,这样在bfs的时候会很简单,比如不用考虑待在原点不懂,或者往回走之类的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>using namespace std;int dt[400][400];
int dx[5] = {0, 0, 1, 0, -1}, dy[5] = {0, 1, 0, -1, 0};struct node {int x, y, t;
};int bfs()
{if(dt[0][0] == 0) return -1;if(dt[0][0] == -1 ) return 0;queue<node> q;node temp,newt;temp.x = 0, temp.y = 0, temp.t = 0;q.push(temp);while(!q.empty()){temp = q.front();q.pop();for(int i = 1; i < 5; i++){newt.x = temp.x + dx[i];newt.y = temp.y + dy[i];newt.t = temp.t + 1;if(newt.x < 0 || newt.y < 0) continue;if(dt[newt.x][newt.y] == -1) return newt.t;if(dt[newt.x][newt.y] <= newt.t) continue;q.push(newt);dt[newt.x][newt.y] = newt.t;}}return -1;
}int main()
{int m;while(scanf("%d", &m) != EOF){int x, y, t;memset(dt, -1, sizeof(dt));for(int j = 0; j < m; j++){scanf("%d%d%d", &x, &y, &t);for(int i = 0; i < 5; i++){int nx = x + dx[i], ny = y + dy[i];if(nx < 0 || ny < 0) continue;if(dt[nx][ny] == -1) dt[nx][ny] = t;else if(dt[nx][ny] > t) dt[nx][ny] = t;}}printf("%d\n",bfs());}return 0;
}

View Code

转载于:https://www.cnblogs.com/Lucas666/p/4732312.html

[DFS] [BFS] poj1979 poj3009 poj3669相关推荐

  1. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  2. POJ2308连连看dfs+bfs+优化

    DFS+BFS+MAP+剪枝 题意:       就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路:      首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...

  3. 链式前向星模板 建图+dfs+bfs+dijkstra

    边没有用struct封装起来,节点和边的计数起点如果不符合习惯可以稍作修改 建图+DFS+BFS #include <cstdio> #include <cstring> #i ...

  4. 算法 - DFS/BFS

    DFS函数大概率会传递"位置信息",根据位置信息获取下一步的选择,(大部分是在循环中)选择.执行.回退 例如N皇后的 棋盘位置(x, y),组合问题的 idx DFS函数的目的是, ...

  5. [Leetcode][第130题][JAVA][被围绕的区域][DFS][BFS]

    [问题描述][中等] [解答思路] 1. 深度优先搜索 使用深度优先搜索实现标记操作.在下面的代码中,我们把标记过的字母 O 修改为字母 A. 复杂度 class Solution {int[] dx ...

  6. 1.5万字详述 | 全开源:python写小游戏+AI强化学习与传统DFS/BFS控制分别实现

    简介:本周的强化学习我们来到实践部分.我以我在 GitHub 上开源的项目 PiperLiu / Amazing-Brick-DFS-and-DRL 为对象,从零开始与各位朋友分享:如何用 pytho ...

  7. java bfs dfs_java优先搜索(DFS/BFS)实际应用

    深度优先搜索DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.广度优先搜索BFS是Breadth First Sear ...

  8. 洛谷 P1710 地铁涨价 (dfs+bfs)

    地铁涨价 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地铁连接两个不同的站. 地铁计 ...

  9. ROB 第一篇 DFS BFS (寻迹算法)

    ROB 第一篇 DFS & BFS DFS & BFS 简单介绍 原理 DFS BFS 总结 DFS & BFS 简单介绍 DFS (depth first search) 和 ...

最新文章

  1. ncurse界面编程多线程示例
  2. Keil左侧显示行数
  3. 转【快速把web项目部署到weblogic上】
  4. 【Python基础】刷爆网络的动态条形图,3行Python代码就能搞定
  5. SQL Server中的SQL语句优化与效率问题
  6. [设计模式]代理模式
  7. c#连接sqlserver
  8. Git 分支相关操作
  9. Android studio修改Logcat颜色
  10. Java实现List数组的几种替代方案
  11. Linux篇:通配符的应用
  12. 条件独立的理解及举例
  13. 凸优化第四章凸优化问题 4.2 凸优化
  14. 项目复制引起的访问路径与项目名不一致
  15. CAN通讯程序C语言,基于单片机的CANBUS程序(C语言)
  16. 关于深度学习的网络流量分类论文整理(一)
  17. 在线弹钢琴HTML源码,在线弹钢琴 1.0
  18. 何钦铭c语言第三版第9章答案,c语言程序设计第3版何钦铭 颜 晖 第9章 结构.pdf...
  19. PureMVC 游戏框架解析
  20. 沃尔什函数 与 沃尔什-哈达玛变换

热门文章

  1. python3.8版本支持flask-sqlalchey包吗_python3中使用flask_sqlalchemy的几个问题
  2. python拿什么做可视化界面好_5大Python可视化库到底选哪个好?一篇文章搞定从选库到教学...
  3. 【Elasticsearch】 es watcher 视频 笔记
  4. 【Elasticsearch】所有可用 Qbox 插件概述:第一部分
  5. 【ElasticSearch】Es 源码之 ActionModule 源码解读
  6. 【Elasticsearch】Elasticsearch 集群健康值黄色 解决方案 或者 分片 未分配
  7. 【Siddhi】Siddhi 如何表示布尔 Syntax error in SiddhiQL, mismatched input ‘boolean
  8. 95-240-040-原理-State-简介
  9. 【Calcite】CHAR(1) CHARACTER SET “ISO-8859-1“ COLLATE “ISO-8859-1$en_US$primary“ NOT NULL
  10. MySQL 索引优化器选择索引的规则