对于图(实质上在编程中我们都用的是二维数组来存储)的相邻点的递归遍历模板如下:
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]的情况出现