NYOJ 27 水池数目

#include<stdio.h>

int n;
int map[101][101];
int row, col;
int der[4][2]={{0, 1},{1, 0},{0 , -1},{-1, 0}};//用二维数组记录四个方向

void count(int x, int y)
{	
	int i;
	int x1,y1 ;
	map[x][y] = 0;//可以走到即置零
	//else
	//{
	for(i = 0; i < 4; i ++)
	{
		x1 = x;//可以不改变当前坐标,进入下一个点
		y1 = y;
		x1 += der[i][0];//妙!!!!!
		y1 += der[i][1];
		if(x1 < 0 || y1 < 0 || x1 == row || y1 == col)
			continue;
		else{
			if(map[x1][y1] == 1)
				count(x1, y1);
		}
	}

	//}
}
int main ()
{
	int i, j;
	int N;
	scanf("%d", &N);
	getchar();
	while(N --){
		scanf("%d%d",&row,&col);
		getchar();
		for(i = 0 ; i < row; i ++)
			for(j = 0 ; j < col; j ++)//这能这样初始化,不然会第一行 100 列 全部输入完再走下一行
			{
				scanf("%d",&map[i][j]);//初始化地图
				getchar();
			}
		for(i = 0 ; i < row; i ++)
			for(j = 0 ; j < col; j ++)//判断不为0 的点
			{
				if(map[i][j] == 1)//一条路径走完,那一片都被标记为 0,下次不会被找到
				{
					n++;
					count(i, j);
				}
			}
		printf("%d\n",n);
		
		n = 0;
	}
	return 0;
}

思路:以一个点为基准,这个点所能走到的所有的点  构成的一片都当成1个水池 , 即一个点所能走过的路径就是 一片

      我们只需要记录我走了一次路 就好

       为了便于查找点,和判断点,我们采用 遇到 水池 ,水池数目加一,而走过的路  标记为0 的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值