搜索 基础 AC

题目网址: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\n",numr,numb);
	}
	return 0;
}

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值