二分——B - Red and Black

B - Red and Black

题目

思路
从起点出发,往四个方向搜索,找到’#‘就变为’.’,边找边计数

代码c

#include <stdio.h>
int cnt;
void find(int fha, int fwa, int fh, int fw, char fa[][22]);
void up(int uha, int uwa, int uh, int uw, char ua[][22])
{
	uha--;
	if(uha<0||uwa<0||uha>=uh||uwa>=uw)
		return ;
	if(ua[uha][uwa]=='.'){
		ua[uha][uwa]='#';
		cnt++;
		find(uha, uwa, uh, uw, ua);
	}
}
void down(int dha, int dwa, int dh, int dw, char da[][22])
{
	dha++;
	if(dha<0||dwa<0||dha>=dh||dwa>=dw)
		return ;
	if(da[dha][dwa]=='.'){
		da[dha][dwa]='#';
		cnt++;
		find(dha, dwa, dh, dw, da);
	}
}
void left(int lha, int lwa, int lh, int lw, char la[][22])
{
	lwa--;
	if(lha<0||lwa<0||lha>=lh||lwa>=lw)
		return ;
	if(la[lha][lwa]=='.'){
		la[lha][lwa]='#';
		cnt++;
		find(lha, lwa, lh, lw, la);
	}
}
void right(int rha, int rwa, int rh, int rw, char ra[][22])
{
	rwa++;
	if(rha<0||rwa<0||rha>=rh||rwa>=rw)
		return ;
	if(ra[rha][rwa]=='.'){
		ra[rha][rwa]='#';
		cnt++;
		find(rha, rwa, rh, rw, ra);
	}	
}
void find(int fha, int fwa, int fh, int fw, char fa[][22])
{
	up(fha,fwa,fh,fw,fa);
	down(fha,fwa,fh,fw,fa);
	left(fha,fwa,fh,fw,fa);
	right(fha,fwa,fh,fw,fa);
}
int main()
{
	int h,w;
	int hi,wi;
	int ha,wa;
	char a[22][22];
	scanf("%d%d",&w,&h);
	while(h!=0||w!=0){
		cnt=1;
		for(hi=0; hi<h; hi++){
			scanf("%s",&a[hi]);
		}
		for(hi=0; hi<h; hi++){
			for(wi=0; wi<w; wi++){
				if(a[hi][wi]=='@'){
					ha=hi;
					wa=wi;
					break;
				}
			}
			if(a[hi][wi]=='@')
				break;
		}
		find(ha,wa,h,w,a);
		printf("%d\n",cnt);
		scanf("%d%d",&w,&h);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值