bfs和dfs:poj2386和leetcode130
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';
}
}
}
}