hdoj1241Oil Deposits bfs|dfs

来源:互联网 发布:如何搭建apache服务 编辑:程序博客网 时间:2024/05/23 00:24

在csdn水的第一篇

题目链接

DFS

#include <iostream>using namespace std;const int Max=110;char map[Max][Max];int x,y,count=0;int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//八个方向bool in_range(int x0, int y0)//判断坐标是否在界内{    if (( x0<x && x0>=0 ) && ( y0>=0 && y0<y ))        return true;    return false;}void dfs(int x0,int y0){    map[x0][y0]='*';    int xx,yy;    for(int i=1;i<=8;i++)   //八个方向    {        xx=x0+dir[i-1][0];        yy=y0+dir[i-1][1];        if(in_range(xx,yy)&&map[xx][yy]=='@')  //界内&为@ → dfs该点            dfs(xx,yy);    }}int main(){    int h,w;    while(cin>>h>>w,h||w)    {        x=h,y=w;        int num=0;        for(int i=0;i<h;i++)            for(int j=0;j<w;j++)                cin>>map[i][j];        for(int i=0;i<h;i++)            for(int j=0;j<w;j++)                if(map[i][j]=='@')                {dfs(i,j);num++;}        cout<<num<<endl;    }    return 0;}

BFS

#include <iostream>#include <string.h>#include <queue>#define F(i,a,b) for(int i=a;i<=b;i++)#define f(i,a,b) for(int i=a;i<b;i++)#define mem(a); memset(a,0,sizeof(a));#define CTW int T;cin>>T;while(T--)#define put(a);  cout<<a<<endl;using namespace std;const int Max=110;char map[Max][Max];int x,y,num=0;int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//                ↖     ↑     ↗     ←    →     ↙     ↓    ↘bool in(int x0, int y0){return  x0<x && x0>=0 && y0>=0 && y0<y;}void bfs(int x0,int y0){queue<int>q;int x,y,xx,yy;q.push(x0),q.push(y0);while(!q.empty()){x=q.front(),q.pop();y=q.front(),q.pop();f(i,0,8){xx=x+dir[i][0],yy=y+dir[i][1];if(!in(xx,yy)||map[xx][yy]=='*')continue;map[xx][yy]='*';q.push(xx),q.push(yy);}}}int main(){    while(cin>>x>>y,x||y)    {        num=0;        f(i,0,x)cin>>map[i];        f(i,0,x)f(j,0,y)if(map[i][j]=='@'){map[i][j]='*';bfs(i,j);num++;}        put(num);    }    return 0;}


0 0
原创粉丝点击