[搜索]DFS+BFS

来源:互联网 发布:2017淘宝手机店铺装修 编辑:程序博客网 时间:2024/05/22 17:06

从一道水题 看下基本思路

POJ 3620  DFS ver1.

#include<iostream>#include<queue>using namespace std;#define FRE freopen("in.txt","r",stdin)const int N = 110;int map[110][110];int xmove[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};int n, m;int cnt, ans;int  dfs(int x, int y){int i, Mx, My ,ans = 0;for(i=0;i<4;i++){Mx = x + xmove[i][0];My = y + xmove[i][1];if(Mx<0||My<0||Mx==n||My==m||map[Mx][My]==0)continue;//printf("%d %d\n", Mx, My);map[Mx][My] = 0;ans += dfs(Mx, My) + 1;}return ans;}int main(){//FRE;int k;scanf("%d%d%d", &n, &m, &k);int i, j,  x, y;memset(map, 0, N*N*sizeof(int));for(i=0;i<k;i++){scanf("%d%d", &x, &y);map[x-1][y-1] = 1;}int res = 0;for(i=0;i<n;i++){for(j=0;j<m;j++)if(map[i][j]){map[i][j] = 0;res = max(dfs(i, j)+1, res);}}printf("%d\n", res);}


POJ 3620  DFS ver12

#include<iostream>#include<queue>using namespace std;#define FRE freopen("in.txt","r",stdin)const int N = 110;int map[110][110];int xmove[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};int n, m;int cnt, ans;void dfs(int x, int y){int i, Mx, My;for(i=0;i<4;i++){Mx = x + xmove[i][0];My = y + xmove[i][1];if(Mx<0||My<0||Mx==n||My==m||map[Mx][My]==0)continue;//printf("%d %d\n", Mx, My);map[Mx][My] = 0;cnt++;dfs(Mx, My);}}int main(){//FRE;int k;scanf("%d%d%d", &n, &m, &k);int i, j,  x, y;memset(map, 0, N*N*sizeof(int));for(i=0;i<k;i++){scanf("%d%d", &x, &y);map[x-1][y-1] = 1;}int res = 0;for(i=0;i<n;i++){for(j=0;j<m;j++)if(map[i][j]){cnt = 1;map[i][j] = 0;dfs(i, j);res = max(res, cnt);}}printf("%d\n", res);}


POJ 3626 BFS ver.

#include<iostream>using namespace std;#define FRE freopen("in.txt","r",stdin)const int N = 1010;int xmove[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};int map[N][N];int que[N*N][2];int step[N][N];int Dx, Dy;int  bfs(int x, int y){int i, front = 0, rear = 0, ans = 0;int Mx, My;map[x][y] = 0;que[rear][0] = x;que[rear][1] = y;bool find = false;while(front<=rear&&!find){for(i=0;i<4;i++){Mx = que[front][0] + xmove[i][0];My = que[front][1] + xmove[i][1];//printf("%d %d %d\n", Mx, My);if(Mx<0||My<0||Mx>1000||My>1000||map[Mx][My])continue;step[Mx][My] = step[que[front][0]][que[front][1]] + 1;if(Mx==Dx&&My==Dy){ans = step[Mx][My];find = true;}map[Mx][My] = 1;//printf("%d %d\n", Mx, My);rear++;que[rear][0] = Mx;que[rear][1] = My;}front++;//printf("queue:%d %d\n", front, rear);}return ans;}int main(){//FRE;int k;scanf("%d%d%d", &Dx, &Dy, &k);Dx += 500;Dy += 500;int i, j;memset(map, 0, N*N*sizeof(int));int x, y;for(i=0;i<k;i++){scanf("%d%d", &x, &y);map[x+500][y+500] = 1;}printf("%d\n", bfs(500, 500));}



原创粉丝点击