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

  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';                }            }        }}
0 0
原创粉丝点击