POJ1979:Red and Black
深搜求区域内单个图形个数:


题意:".“代表黑砖,”#“代表红砖,”@"代表障碍物,计算黑砖的数量。遍历四个方向。

package ACM_深搜dfs;

import java.util.Scanner;

public class poj1979 {
	static int N, M;
	static String[] s;
	static int vis[][];
	static int ans = 0;

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (in.hasNext()) {
			M = in.nextInt();
			N = in.nextInt();
			if (N == 0 && M == 0)
				break;
			s = new String[N];
			vis = new int[N][M];
			for (int i = 0; i < N; i++) {
				s[i] = in.next();
			}
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < M; j++) {
					if (s[i].charAt(j) == '@' && vis[i][j] == 0) {
						dfs(i, j);
						break;// 仅搜索一次
					}
				}
			}
			System.out.println(ans);
			ans = 0;
		}
	}

	private static void dfs(int i, int j) {
		if (i < 0 || i >= N || j < 0 || j >= M || vis[i][j] == 1) {
			return;
		} else if (s[i].charAt(j) == '#') {
			return;
		} else {
			ans++;
			vis[i][j] = 1;
			dfs(i - 1, j);
			dfs(i + 1, j);
			dfs(i, j + 1);
			dfs(i, j - 1);
		}
	}
}

C++版:

#include<iostream>

using namespace std;

//搜索方向 
int nextt[4][2]={   { 0, 1}
,					{ 1, 0}
,					{ 0,-1}
,					{-1, 0}
,								};

//map二维数组
char mapp[25][25];

int n,m;//输入的n列m行 

int num;//计数 

void dfs(int x,int y)
{
	for(int i=0;i<4;i++)
	{
		int gx=x+nextt[i][0];
		int gy=y+nextt[i][1];
		if(gx>=0 && gx<m && gy>=0 && gy<n && mapp[gx][gy]=='.')
		{//如果不越界并且可走 
			num++;
			mapp[gx][gy]='#'; //走过的改掉防止重复计数
			dfs(gx,gy);			
		}
	}
 } 

int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		if(n==0 && m==0)
		{//循环结束条件 
			break;
		}
		for(int i=0;i<m;i++)
		{//输入数组map 
			for(int j=0;j<n;j++)
			{
				cin>>mapp[i][j];
			}
		}
		num=1;
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(mapp[i][j]=='@')
				{//仅搜索一次 
					dfs(i,j);
					break;
				}
			}
		} 
		cout<<num<<endl;		
	}
	return 0;
}