您的位置:首页 > 其它

11Oil Deposits

2016-04-05 20:27 197 查看
简单题意

给出一个地图,其中要么是*要么是@,对于@,横、竖、斜连着的成为一个块,问总共有多个@块

解题思路形成过程

深度优先搜索,首先找到第一个@并以他为起点深搜,直到不能搜索为止,为一个块,之后在找到下一个@,在进行深搜,直到整个地图搜索完,为了避免重复,设置一个标记地图,对进行搜索过的点进行标记。

感想

老师上课讲的思路很清楚,不过自己写出来,总有些地方考虑不周

AC代码

#include<iostream>

#include<string.h>

#include<fstream>

using namespace std;

int m,n;

bool visit[110][110];

char map[110][110];

int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};

bool isbound(int a,int b){

    if(a<1||a>m||b<1||b>n)return true;

    return false;

}

void dfs(int x,int y){

    for(int i=0;i<8;i++){

        if(map[x+dir[i][0]][y+dir[i][1]]=='*')continue;

        if(isbound(x+dir[i][0],y+dir[i][1]))continue;

        if(visit[x+dir[i][0]][y+dir[i][1]])continue;

        visit[x+dir[i][0]][y+dir[i][1]]=1;

        dfs(x+dir[i][0],y+dir[i][1]);

    }

}

int main()

{

    ifstream cin("in.txt");

    while(cin>>m>>n&&m&&n){

        memset(visit,0,sizeof(visit));

        for(int i=1;i<=m;i++){

            for(int j=1;j<=n;j++){

                cin>>map[i][j];

            }

        }

        int sum=0;

        for(int i=1;i<=m;i++){

            for(int j=1;j<=n;j++){

                if(map[i][j]=='@'&&!visit[i][j]){

                    visit[i][j]=1;

                    dfs(i,j);//¶Ô´ËµãÉîËÑ

                    sum++;

                }

            }

        }

        cout<<sum<<endl;

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深度优先搜索