11Oil Deposits

来源:互联网 发布:jdk1.7源码下载 官方 编辑:程序博客网 时间:2024/04/29 16:21

简单题意

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

解题思路形成过程

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

感想

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

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;
}

0 0