1003.相连的1

对于一个01矩阵A,求其中有多少片连成一片的1. 每个1可以和上下左右的1相连.
 
请为下面的Solution类实现解决这一问题的函数countConnectedOnes,函数参数A为给出的01矩阵,A的行数和列数均不大于1000. 函数的返回值是问题的答案.
 
class Solution {
public:
    int countConnectedOnes(vector<vector<char>>& A) {
                        
    }
};
 
例1:
A=
100
010
001
答案为3.
 
例2:
A=
1101
0101
1110
答案为2.
 
注意:你只需要提交Solution类的代码,你在本地可以编写main函数测试程序,但不需要提交main函数的代码. 注意不要修改类和函数的名称.

 问题分析:

很容易想到,这道题是传统的图论求联通分量的变形,将1看成两个节点的边,0看做两个节点没有边,此外还要注意判断边界上的数字的方向问题,用传统的DFS就可以求出其联通分量了。

代码:

class Solution {
public:
	vector< vector<bool>> visited;
	vector<int> xxdirect;
	vector<int> yydirece;
	int countConnectedOnes(vector<vector<char>> &A) {

		for(int i=0;i<A.size();i++){
			vector<bool> temp;
			for(int j=0;j<A[i].size();j++)
			{
				temp.push_back(false);
			}
			visited.push_back(temp);
		}
		xxdirect.push_back(-1);
		xxdirect.push_back(1);
		yydirece.push_back(-1);
		yydirece.push_back(1);
		int value=DFS(A);
		//cout<<value;
		return value;
	}
	int DFS(vector<vector<char>> &A){
		int value=0;
		for(int i=0;i<A.size();i++){
			for(int j=0;j<A[i].size();j++){
				if(!visited[i][j]&&A[i][j]!='0')
			{DFSFunction(i,j,A);
				value++;}
			}
		}
		return value;
	}
	void DFSFunction(int row,int col,vector<vector<char>> &A){
		visited[row][col]=true;
		//cout<<row<<" "<<col<<endl;
		for(int i=0;i<xxdirect.size();i++){
			if((col==0&&xxdirect[i]==-1)||(col==A[row].size()-1&&xxdirect[i]==1)) continue;
			if(A[row][col+xxdirect[i]]!='0'&&!visited[row][col+xxdirect[i]])
			DFSFunction(row,col+xxdirect[i],A);
			}
		for(int i=0;i<yydirece.size();i++){
			if((row==0&&yydirece[i]==-1)||(row==A.size()-1&&yydirece[i]==1)) continue;
			if(A[row+yydirece[i]][col]!='0'&&!visited[row+yydirece[i]][col])
			DFSFunction(row+yydirece[i],col,A);
		}
		}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值