深搜01 Counting Sheep

A while ago I had trouble sleeping. I used to lie awake, staring at the ceiling, for hours and hours. Then one day my
grandmother suggested I tried counting sheep after I'd gone to bed. As always when mygrandmother suggests things, I decided
to try it out. The only problem was, there were no sheep around to be counted when I went to bed.
Creative as I am, that wasn't going to stop me. I sat down and wrote a computer program that made a grid of characters,
where # represents a sheep, while . is grass (or whatever you like, just not sheep). To make the counting a little more
interesting, I also decided I wanted to count flocks of sheep instead of single sheep. Two sheep are in the same flock
if they share a common side (up, down, right or left). Also, if sheep A is in the same flock as sheep B, and sheep B is
in the same flock as sheep C, then sheeps A and C are in the same flock.
Now, I've got a new problem. Though counting these sheep actually helps me fall asleep, I find that it is extremely boring.
To solve this, I've decided I need another computer program that does the counting for me. Then I'll be able to just start
both these programs before I go to bed, and I'll sleep tight until the morning without any disturbances. I need you to
write this program for me.
输入
The first line of input contains a single number T, the number of test cases to follow.
Each test case begins with a line containing two numbers, H and W, the height and width of the sheep grid. Then follows
H lines, each containing W characters (either # or .), describing that part of the grid.
输出
For each test case, output a line containing a single number, the amount of sheep flock son that grid according to the
rules stated in the problem description.
Notes and Constraints
0 < T <= 100
0 < H,W <= 100
样例输入
2
4 4
#.#.
.#.#
#.##
.#.#
3 5
###.#
..#..
#.###
样例输出
6
3

#include<cstdio>
#include<iostream>
using namespace std;
int vis[101][101];
//上(0,1)、下(0,-1)、左(-1,0)、右(1,0) 
int dx[4]= {0,0,-1,1};
int dy[4]= {1,-1,0,0};
char photo[101][101];
void clear() {
	for(int i=0; i<101; i++) {
		for(int j=0; j<101; j++) {
			vis[i][j]=0;
		}
	}
}
void dfs(int x,int y,int width,int height) {
	if(x<0||x>=width||y<0||y>=height||photo[x][y]!='#') {//如果在边界之外或者不是我们想要的字符'#',则不继续搜索 
		return;
	}
	if(!vis[x][y]) {//如果这个点没有搜索过 
		vis[x][y]=1;
		for(int i=0; i<4; i++) {//往上下左右四个方向搜索 
			//注意:这里需要把具体的值带进去,如x+dx[i],y+dy[i],而不是先更改x或y的值,再把x和y带进去 
			dfs(x+dx[i],y+dy[i],width,height);
		}
	}
}
int main() {
	//freopen("in.txt","r",stdin);
	int width,height,t;
	scanf("%d",&t);//重复的组数 
	while(t--) {
		scanf("%d %d",&width,&height);
		getchar();//过滤掉回车符
		clear();//给vis数组清零 
		for(int i=0; i<width; i++) {//输入表格 
			for(int j=0; j<height; j++) {
				scanf("%c",&photo[i][j]);
			}
			getchar();//每一行输入后,过滤掉回车符
		}
		int count=0;
		for(int i=0; i<width; i++) {
			for(int j=0; j<height; j++) {
				if(!vis[i][j]&&photo[i][j]=='#') {//便于寻找下一个区域 
					dfs(i,j,width,height);
					count++;
				}
			}
		}
		printf("%d\n",count);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jiuweideqixu/article/details/88055261