NYOJ27 水池数目

水池数目

时间限制:3000 ms  |  内存限制:65535 KB

难度:4

  • 描述

  • 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。

    • 输入

    • 第一行输入一个整数N,表示共有N组测试数据
      每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面)

    • 输出

    • 输出该地图中水池的个数。
      要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。

    • 样例输入

    • 2
      3 4
      1 0 0 0 
      0 0 1 1
      1 1 1 0
      5 5
      1 1 1 1 0
      0 0 1 0 1
      0 0 0 0 0
      1 1 1 0 0
      0 0 1 1 1
    • 样例输出

    • 2
      3


一开始没想到去修改地图上的数值,而是多用了一个数组,相对标程复杂

#include <iostream>

using namespace std;

int m1,m2;
int dp[100][100],map[100][100];//,direct[4][2];

int direct[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

void Dp(int x, int y)
{
	int k,xx,yy;
	dp[x][y]=1;
	for(k=0;k<4;k++)
	{
		xx=x+direct[k][0];
		yy=y+direct[k][1];
		if(xx>=0&&xx<m1 && yy>=0&&yy<m2 && 1==map[xx][yy] && 0==dp[xx][yy])
			Dp(xx,yy);
	}
}

int Search(int x, int y)
{
	int k,xx,yy;
	if((1==map[x][y]) && (0==dp[x][y]))
	{
		dp[x][y]=1;
		for(k=0;k<4;k++)
		{
			xx=x+direct[k][0];
			yy=y+direct[k][1];
			//yy>=0&&yy<m2 写成了 yy>0&&yy<m2 多浪费了2个小时。。。。。。。
			if(xx>=0&&xx<m1 && yy>=0&&yy<m2 && 1==map[xx][yy] && 0==dp[xx][yy])
				Dp(xx,yy);
		}
		return 1;
	}
	return 0;
}

int main()
{
	int n,i,j,count;
	cin>>n;
	while(n--)
	{
		//构建地图
		cin>>m1>>m2;
		for(i=0;i<m1;i++)
			for(j=0;j<m2;j++)
			{
				cin>>map[i][j];
				dp[i][j]=0;
			}
		//找水池
		count=0;
		for(i=0;i<m1;i++)
			for(j=0;j<m2;j++)
				if(Search(i,j))
					++count;
		cout<<count<<endl;
				
	}
	return 0;
}


看过标程之后改的

#include <iostream>

using namespace std;

int map[102][102];
int direct[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int m1,m2;

void Search(int x, int y)
{
	int k,xx,yy;
	for(k=0;k<4;k++)
	{
		xx=x+direct[k][0];
		yy=y+direct[k][1];
		if(xx>=0&&xx<m1 && yy>=0&&yy<m2 && 1==map[xx][yy])
		{
			map[xx][yy]=0;
			Search(xx,yy);
		}
	}
}

int main()
{
	int n,i,j,count;
	cin>>n;
	while(n--)
	{
		//构建地图
		cin>>m1>>m2;
		for(i=0;i<m1;i++)
			for(j=0;j<m2;j++)
				cin>>map[i][j];
			
		count=0;
		//找水池
		for(i=0;i<m1;i++)
			for(j=0;j<m2;j++)
			{
				if(map[i][j])
				{
					count++;
					map[i][j]=0;
					Search(i,j);
				}
			}
			
		cout<<count<<endl;				
	}
	return 0;
}


你可能感兴趣的:(ACM,水池数目,NYOJ27)