bfs和dfs:poj2386和leetcode130
来源:互联网 发布:windows仿mac软件 编辑:程序博客网 时间:2024/06/06 13:06
poj2386
如果发现一个’W’则使用dfs递归将与其相连的’W’都改为’.’,每遇到一个’W’(亦即调用一次dfs)将ans加一(发现一个水坑)。
#include <iostream>using namespace std;const int MAX_NM = 105;char ch[MAX_NM][MAX_NM];int m, n;void dfs(int x, int y) { ch[x][y] = '.'; for(int i=-1; i<=1; i++) { for(int j=-1; j<=1; j++) { int dx = x + i; int dy = y + j; if(dx>=0 && dy>=0 && dx<m && dy<n && ch[dx][dy]=='W') dfs(dx, dy); } }}int main() { scanf("%d%d", &m, &n); for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { cin>>ch[i][j]; } } int ans = 0; for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { if(ch[i][j] == 'W') { dfs(i, j); ans++; } } } printf("%d\n", ans); return 0;}
leetcode130:此题的输入并不是一个方阵。
没被’X’包围的’O’都在边界上或者与一个在边界上的’O’相连,故:
- 每在边界上发现一个’O’就将其以及与其相连的’O’都改为’B’;
- 遍历完board后,将所有的’O’改为’X’,将所有的’B’改为’O’。
此题有一个输入是:[“OOOOOOOOOOOOOOO……”]如果用dfs递归求解会栈溢出,所以改为bfs使用一个队列求解。
public class Solution { int[] nx = new int[]{-1, 1, 0, 0}; int[] ny = new int[]{0, 0, -1, 1}; class Point { int i; int j; public Point(int i, int j) {this.i=i; this.j=j;} @Override public String toString() {return i + "," + j;} } public void bfs(boolean[][] used, char[][] bb, int x, int y) { // bb[x][y] = 'B'; // for(int i=0; i<=3; i++) { // int dx = x + nx[i]; // int dy = y + ny[i]; // if(dx>=0 && dy>=0 && dx<bb.length && dy<bb[0].length && bb[dx][dy]=='O') dfs(bb, dx, dy); // } Queue<Point> que = new LinkedList<Point>(); que.offer(new Point(x, y)); while(!que.isEmpty()) { int qx = que.element().i; int qy = que.element().j; bb[qx][qy] = 'B'; que.poll(); for(int i=0; i<=3; i++) { int dx = qx + nx[i]; int dy = qy + ny[i]; if(dx>=0 && dy>=0 && dx<bb.length && dy<bb[0].length && !used[dx][dy] && bb[dx][dy]=='O') { que.offer(new Point(dx, dy)); used[dx][dy] = true; } } } } public void solve(char[][] board) { if(board.length < 2 || board[0].length < 2) return; boolean[][] used = new boolean[board.length][board[0].length]; //board.length是指行的数目 //board[0].length是指列的数目 for(int i=0; i<board.length; i++) //第一列 if(board[i][0] == 'O') bfs(used, board, i, 0); for(int i=0; i<board.length; i++) //最后一列 if(board[i][board[0].length-1] == 'O') bfs(used, board, i, board[0].length-1); for(int i=0; i<board[0].length; i++) //第一行 if(board[0][i] == 'O') bfs(used, board, 0, i); for(int i=0; i<board[0].length; i++) //最后一行 if(board[board.length-1][i] == 'O') bfs(used, board, board.length-1, i); for(int i=0; i<board.length; i++) { for(int j=0; j<board[0].length; j++) { if(board[i][j] == 'O') board[i][j] = 'X'; else if(board[i][j] == 'B') board[i][j] = 'O'; } } }}
0 0
- bfs和dfs:poj2386和leetcode130
- POJ2386-简单BFS/DFS
- poj2386(BFS与DFS)
- DFS和BFS
- BFS和DFS模板
- BFS和DFS算法
- BFS和DFS算法
- BFS和DFS
- dfs 和 bfs 解析
- POJ3083 -- BFS和DFS
- bfs 和 dfs 专题
- 关于BFS和DFS
- DFS和BFS模板
- bfs和dfs 模板
- 算法-DFS和BFS
- 【图】BFS和DFS
- dfs和bfs
- acm bfs和dfs
- 网易互联网2017在线笔试题目-魔力手环
- 插入排序——希尔排序
- Bash-shell
- Java设计模式《十八》桥接模式
- LeetCode 543. Diameter of Binary Tree
- bfs和dfs:poj2386和leetcode130
- linux 使用jrtplib收发h.264视频文件
- 无法打开输入文件“libcaffe.lib” 解决方法
- SpringMVC简单注解实例--简要调用过程
- Angular2源码解读之ChangeDetection
- angular.copy()
- Java RandomAccessFile用法
- vim实现两个文件之间的复制
- Java设计模式《十九》命令模式