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