DFS的两种实现:
import java.util.Scanner; public class hdu1312DFS { static char map[][]=new char[22][22]; static int x,y; static int inc[][]={{1,0},{0,1},{-1,0},{0,-1}}; static int ans; static void init() { Scanner in=new Scanner(System.in); while(true) { y=in.nextInt(); x=in.nextInt(); if(x==0&&y==0) break; int a=-1,b=-1; for(int i=1;i<=x;i++) { String data=in.next(); for(int j=1;j<=y;j++) { map[i][j]=data.charAt(j-1); if(map[i][j]=='@') { a=i; b=j; } } } ans=0; DFS1(a,b); System.out.println(ans); } } static void DFS(int a,int b) { if(map[a][b]=='#'||a<1||b<1||a>x||b>y) return; if(map[a][b]=='.') { ans++; map[a][b]='#'; } for(int i=0;i<4;i++) { int x=a+inc[i][0]; int y=b+inc[i][1]; DFS(x,y); } } static void DFS1(int a,int b) { if(map[a][b]=='#'||a<1||b<1||a>x||b>y) return; else { ans++; map[a][b]='#'; DFS1(a+1,b); DFS1(a,b+1); DFS1(a-1,b); DFS1(a,b-1); } } public static void main(String[] args) { init(); } }
BFS的实现:
import java.util.ArrayList; import java.util.Scanner; //BFS实现 public class hdu1312BFS { static int inc[][]={{1,0},{0,1},{-1,0},{0,-1}}; static char map[][]=new char[110][110]; static int x,y; class Node { int x; int y; } static int ans; void build() { Scanner in=new Scanner(System.in); while(true) { y=in.nextInt(); x=in.nextInt(); if(x==0&&y==0) break; int a=-1,b=-1; ans=1; for(int i=1;i<=x;i++) { String line=in.next(); for(int j=1;j<=y;j++) { map[i][j]=line.charAt(j-1); if(map[i][j]=='@') { a=i; b=j; } } } BFS(a,b); } } void BFS(int a,int b) { ArrayList<Node> q=new ArrayList<Node>() ; Node cur=new Node(); Node next; cur.x=a; cur.y=b; map[a][b]='#'; q.add(cur); while(!q.isEmpty()) { cur=q.get(0); for(int i=0;i<4;i++) { next=new Node(); next.x=cur.x+inc[i][0]; next.y=cur.y+inc[i][1]; if(next.y<=y&&next.x<=x&&next.x>=1&&next.y>=1&&map[next.x][next.y]=='.') { ans++; map[next.x][next.y]='#'; q.add(next); } } q.remove(cur); } System.out.println(ans); } public static void main(String[] args) { new hdu1312BFS().build(); } }
再贴一个cpp的:
//============================================================================ // Name : hdu1312BFS.cpp // Author : xinge // Version : // Copyright : Your copyright notice // Description : Ansi-style //============================================================================ #include <iostream> #include <cstring> #include <cstdio> #include <math.h> #include <stdio.h> #include <algorithm> #include<cmath> #include<queue> using namespace std; //BFS char map[110][110]; int xx,yy,ans; int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}}; struct Node { int x,y; }; void BFS(int a,int b) { queue<Node> q; Node cur,next; cur.x=a; cur.y=b; q.push(cur); map[a][b]='#'; while(!q.empty()) { cur=q.front(); q.pop(); for(int i=0;i<4;i++) { next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; if(next.x<xx&&next.y<yy&&next.x>=0&&next.y>=0&&map[next.x][next.y]=='.') { ans++; map[next.x][next.y]='#'; q.push(next); } } } printf("%d\n",ans); } int main() { while(~scanf("%d%d",&yy,&xx)) { if(xx==0&&yy==0) break; int i,j,a=-1,b=-1; ans=1; for(i=0;i<xx;i++) scanf("%s",&map[i]); for(i=0;i<xx;i++) for(j=0;j<yy;j++) { if(map[i][j]=='@') { a=i; b=j; BFS(a,b); } } } return 0; }