搜索 基础 AC 2014-01-14 15:53 170人阅读 评论(0) 收藏

题目网址:http://haut.openjudge.cn/xiyoulianxi1/1/

1:晶矿的个数

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

在某个区域发现了一些晶矿,已经探明这些晶矿总共有分为两类,为红晶矿和黑晶矿。现在要统计该区域内红晶矿和黑晶矿的个数。假设可以用二维地图m[][]来描述该区域,若m[i][j]为#表示该地点是非晶矿地点,若m[i][j]为r表示该地点是红晶矿地点,若m[i][j]为b表示该地点是黑晶矿地点。一个晶矿是由相同类型的并且上下左右相通的晶矿点组成。现在给你该区域的地图,求红晶矿和黑晶矿的个数。

输入
第一行为k,表示有k组测试输入。
每组第一行为n,表示该区域由n*n个地点组成,3 <= n<= 30
接下来n行,每行n个字符,表示该地点的类型。
输出
对每组测试数据输出一行,每行两个数字分别是红晶矿和黑晶矿的个数,一个空格隔开。
样例输入
2
6
r##bb#
###b##
#r##b#
#r##b#
#r####
######
4
####
#rrb
#rr#
##bb
样例输出
2 2
1 2





#include<stdio.h>
int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
char map[35][35];


void clean(char c,int x,int y){
	int i;
	map[x][y]='#';
	for(i=0;i<4;i++){
		int k=x+d[i][0];
		int b=y+d[i][1];
		if(map[k][b]==c){
			clean(c,k,b);
		}
	}
}

int main(){
	int s,n;
	int x,y;
	scanf("%d",&n);
	while(n--){
		int numb=0;
		int numr=0;
		scanf("%d",&s); 
		getchar();
		for(x=0;x<s;x++){
			for(y=0;y<s;y++){
				scanf("%c",&map[x][y]);
			}
			getchar();
		}
		
		for(x=0;x<s;x++){
			for(y=0;y<s;y++){
				if(map[x][y]=='b'){
					clean('b',x,y);
					numb++;
				}
				if(map[x][y]=='r'){
					clean('r',x,y);
					numr++;
				}
			}
		}
	
		printf("%d %d
",numr,numb);
	}
	return 0;
}

搜索的简单例题,居然花了2个小时,各种小错误,有种跳楼的感觉

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文为博主原创文章,未经博主允许不得转载。
原文地址:https://www.cnblogs.com/you-well-day-fine/p/4671677.html