华为OD机试 - 可以组成网络的服务器【C++】

题目

在一个机房中,服务器的位置标识在 n*m 的整数矩阵网格中,1 表示单元格上有服务器,0 表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网。
请你统计机房中最大的局域网包含的服务器个数。

输入描述

第一行输入两个正整数,n和m,0<n,m<=100

之后为n*m的二维数组,代表服务器信息

输出描述

最大局域网包含的服务器个数。

用例

输入2 2
1 0
1 1
输出3
说明[0][0]、[1][0]、[1][1]三台服务器相互连接,可以组成局域网

#include <stdio.h>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <algorithm>
#include <math.h>
using namespace std;

class CNetServer
{
public:
	unsigned int m_uiX;
	unsigned int m_uiY;
	int m_ArryServer[100][100];
	int m_iMaxServer;
	CNetServer(int iX,int iY,void* pBuff)
		:m_uiX(iX),m_uiY(iY)
	{
		m_iMaxServer = 0;
		memset(m_ArryServer,0x00,100*100*sizeof(int));
		if (pBuff != 0)
		{
			for (int i = 0; i < m_uiY;i++)
			{
				memcpy(m_ArryServer[i],pBuff,m_uiX*sizeof(int));
			}
		}
		for (int xCur = 0;xCur < m_uiX;xCur++)
		{
			for (int yCur = 0;yCur < m_uiX;yCur++)
			{
				int iCountServer = 0;
				iCountServer = FindCurPointNet(xCur,yCur,iCountServer);
				if (iCountServer > m_iMaxServer)
				{
					m_iMaxServer = iCountServer;
				}
			}
		}
	}
protected:
	int FindCurPointNet(int iXpos,int iYpos,int iCount)
	{
		if (!IsPos(iXpos,iYpos) || !HaveServer(iXpos,iYpos))
		{
			return iCount;
		}
		iCount += 1;
		m_ArryServer[iXpos][iYpos] = 0;
		//top
		iCount = FindCurPointNet(iXpos,iYpos + 1,iCount);
		//bottom
		iCount = FindCurPointNet(iXpos,iYpos - 1,iCount);
		//left
		iCount = FindCurPointNet(iXpos - 1,iYpos,iCount);
		//right
		iCount = FindCurPointNet(iXpos + 1,iYpos,iCount);
		return iCount;

	}
	bool IsPos(int iXpos,int iYpos)
	{
		bool bRet(true);
		if (iXpos >= m_uiX || iXpos < 0)
		{
			bRet = false;
		}
		if (iYpos >= m_uiY || iYpos < 0)
		{
			bRet = false;
		}
		return bRet;
	}
	bool HaveServer(int iXpos,int iYpos)
	{
		if (IsPos(iXpos,iYpos))
		{
			if (m_ArryServer[iXpos][iYpos] == 1)
			{
				return true;
			}
		}
		return false;
	}
private:
};

int main()
{
    int iX(0);
	int iY(0);
	cin >> iX >> iY;
	if (iX < 1 || iY < 1)
	{
		cout << "error input" << endl;
	}
	int* pbuff = new int[iX*iY];
	for (int iCur = 0;iCur < iX*iY; iCur++)
	{
		cin >> *(pbuff + iCur);
		if (pbuff[iCur] >= 1)
		{
			pbuff[iCur] = 1;
		}
		else
		{
			pbuff[iCur] = 0;
		}
	}
	CNetServer oNetServer(iX,iY,pbuff);
	cout << oNetServer.m_iMaxServer << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值