Uva 572-Oil Deposits

来源:互联网 发布:西西里的美丽传说知乎 编辑:程序博客网 时间:2024/06/16 11:45

题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=513

题目类型: 搜索

题意:统计字符’@’组成多少个八连块.如果两个字符’@’所在的格子相邻(横,竖或者对角线方向),就说它们属于同一个八连块.

样例输入:
1 1
*
3 5
@@*
@
@@*
1 8
@@**@*
5 5
**@
@@@
@*@
@@@*@
@@**@
0 0

样例输出:
0
1
2
2

分析:对每一个未被访问过的@的进行深度搜索,一次判断周围八个字符是否 是@,是@则继续深搜

Java代码:

import java.util.Scanner;/** * @author 许湘扬 * @email  547139255@qq.com * @detail Uva572 */public class Main{    public static char[][] graph=new char[100][100];    public static int[][] vis=new int[100][100];    public static int cnt,m,n;    public static void main(String[] args)     {        Scanner cin=new Scanner(System.in);        while(true)        {            //------------读取输入-------------            m=cin.nextInt();            n=cin.nextInt();            if (m==0)                 break;            cin.nextLine();            for(int i=0;i<m;i++)            {                String line=cin.nextLine();                graph[i]=line.toCharArray();            }            //-----------初始化vis数组----------            for(int i=0;i<m;i++)                for(int j =0;j<n;j++)                    vis[i][j]=0;            cnt=0;            for(int i=0;i<m;i++)            {                for(int j =0;j<n;j++)                    if(vis[i][j]==0 && graph[i][j]=='@')                        dfs(i,j,++cnt);            }            System.out.println(cnt);        }    }    private static void dfs(int i, int j, int cnt2)     {        if(i<0 || i>=m || j<0 || j>=n) //跳出边界            return ;        if (graph[i][j]=='*' || vis[i][j]>0) //不过不是@ 或者 @被访问过            return ;        vis[i][j]=cnt2;        //向周围深搜        for(int di=-1;di<=1;di++)            for(int dj=-1;dj<=1;dj++)                if (di!=0 || dj!=0 )                    dfs(di+i, dj+j, cnt2);    }}