图上的相邻点的递归遍历的理解

对于图(实质上在编程中我们都用的是二维数组来存储)的相邻点的递归遍历模板如下:

int viss[MAXN][MAXN];  
//或者用标准库来创建二维数组:
vector< vector<int> > Vss(MAXN , verctor<int>( MAXN , 0 ) )
//多嘴一句:一般在使用vector的时候,尤其是在函数内部使用的时候,一定要指定初始大小。
//否则程序编译能通过,运行时就会报错,类似于对什么未知地址的错误引用
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};// up down left right

bool outofborder(int x,int y){
	if(x>=0 && x<row && y>=0 && y<col) return false;
	return true;
}

void dfss(int x,int y)
{ 
	viss[x][y]=1;
	if(判断条件)
    {
		for(int i=0;i<4;i++)
        { //对当前点的上下左右四个点进行判断 
			int nx=x+dx[i];
			int ny=y+dy[i];
			if(outofborder(nx,ny)==false && viss[nx][ny]==0){
				dfss(nx,ny);
		}
	}
}

注意此处为什么用dx[4]和dy[4]来标记当前点的上下左右相邻四个点,为什么不用一个数组s[3] = {-1,0,1}来实现。我们知道图上从当前点移动到相邻的四个中都只有一步操作,要么是x坐标变化一下,要么是y坐标变化一下。但是使用一个数组的时候,很有可能出现x坐标和y坐标都变化一下(比如x+s[0],y+s[0]),这就出现了两次移动。再好好看下上述的dx和dy数组的对应关系。绝对不会有dx[i] == dy[i]的情况出现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值