方法一:DFS(深度优先搜索)
import java.io.*; import java.util.*; public class Main { public char ch[][]; public int fx[]={1,1,1,-1,-1,-1,0,0}; public int fy[]={0,1,-1,0,1,-1,1,-1}; public int m,n; public static void main(String[] args) { new Main().work(); } public void work(){ Scanner sc=new Scanner(new BufferedInputStream(System.in)); while(sc.hasNext()){ m=sc.nextInt(); n=sc.nextInt(); ch=new char[m][n]; if(m==0) System.exit(0); for(int i=0;i<m;i++){ String s=sc.next(); ch[i]=s.toCharArray(); } int toal=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(ch[i][j]=='@'){ toal++; dfs(i,j); } } } System.out.println(toal); } } public void dfs(int x,int y){ for(int i=0;i<8;i++){ int px=x+fx[i]; int py=y+fy[i]; if(check(px,py)){ ch[px][py]='*'; dfs(px,py); } } } public boolean check(int px,int py){ if(px<0||px>m-1||py<0||py>n-1||ch[px][py]!='@') return false; return true; } }
方法二BFS(广度优先搜索)
import java.io.*; import java.util.*; public class Main { public int m,n; public char ch[][]; public Queue<Bnode> list=new LinkedList<Bnode>(); public int fx[]={1,1,1,-1,-1,-1,0,0}; public int fy[]={0,1,-1,0,1,-1,1,-1}; public static void main(String[] args) { new Main().work(); } public void work(){ Scanner sc=new Scanner(new BufferedInputStream(System.in)); while(sc.hasNext()){ list.clear(); m=sc.nextInt(); n=sc.nextInt(); if(m==0) System.exit(0); ch=new char[m][n]; for(int i=0;i<m;i++){ String s=sc.next(); ch[i]=s.toCharArray(); } int total=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(ch[i][j]=='@'){ total++; Bnode bnode=new Bnode(); bnode.x=i; bnode.y=j; list.add(bnode); BFS(); } } } System.out.println(total); } } public void BFS(){ while(!list.isEmpty()){ Bnode bnode=list.poll(); for(int i=0;i<8;i++){ int px=bnode.x+fx[i]; int py=bnode.y+fy[i]; if(check(px,py)){ ch[px][py]='*'; Bnode t=new Bnode(); t.x=px; t.y=py; list.add(t); } } } } public boolean check(int px,int py){ if(px<0||px>m-1||py<0||py>n-1||ch[px][py]!='@') return false; return true; } } class Bnode { int x; int y; }