NYOJ27 水池数目

时间:2015-04-11 21:08:05   收藏:0   阅读:235

水池数目

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

难度:4


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

#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;
}


本文出自 “hacker” 博客,请务必保留此出处http://anglecode.blog.51cto.com/5628271/1631173

原文:http://anglecode.blog.51cto.com/5628271/1631173

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!