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’相连,故:

  1. 每在边界上发现一个’O’就将其以及与其相连的’O’都改为’B’;
  2. 遍历完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';
                }
            }
        }
}
posted @ 2017-04-22 14:54  StevenLuke  阅读(196)  评论(0编辑  收藏  举报