//如果两点都为空
//垂直向p1点靠近一格
if(px1<p1.x)
px1++;
else if(px1>p1.x)
px1--;
//垂直向p2点靠近一格
if(px2<p2.x)
px2++;
else if(px2>p2.x)
px2--;
}
//如果能到达两个端点
if(px1==p1.x && py1==p1.y && px2==p2.x && py2==p2.y )
{
//起点
way[0].x=p1.x;
way[0].y=p1.y;
//两个转折点
way[1].x=i;
way[1].y=p1.y;
way[2].x=i;
way[2].y=p2.y;
//终点
way[3].x=p2.x;
way[3].y=p2.y;
return true;
}
}
}
if(p1.x>p2.x)
{
//两点交换
temp=p1.x;
p1.x=p2.x;
p2.x=temp;
temp=p1.y;
p1.y=p2.y;
p2.y=temp;
}
//纵向扫描
for(j=0;j<=N-1;j++)
{
y_across=true;
//是否垂直连通
for(i=p1.x+1; i<=p2.x-1; i++ )
{
if(matrix[i][j]!=0)
{
y_across=false;
break;
}
}
if(matrix[p1.x][j]!=0 )
{
if( j!=p1.y )
y_across=false;
}
if(matrix[p2.x][j]!=0 )
{
if( j!=p2.y )
y_across=false;
}
if(y_across)
{//垂直连通才执行下面
/* for(j=1; j<N-2; j++ )
{*/
//检验在水平上是否连通
py1=py2=j;
px1=p1.x;
px2=p2.x;
while( py1!=p1.y || py2!=p2.y)
{
//如果当前点不空且不为p1点,就跳出循环,从下一行开始检测
if( matrix[px1][py1]!=0 && (px1!=p1.x || py1!=p1.y) )
break;
//如果当前点不空且不为p2点,就跳出循环,从下一行开始检测
if( matrix[px2][py2]!=0 && (px2!=p2.x || py2!=p2.y) )
break;
//如果两点都为空
//水平向p1点靠近一格
if(py1<p1.y)
py1++;
else if(py1>p1.y)
py1--;
//水平向p2点靠近一格
if(py2<p2.y)
py2++;
else if(py2>p2.y)
py2--;
}
//如果能到达两个端点
if(px1==p1.x && py1==p1.y && px2==p2.x && py2==p2.y )
{
//起点
way[0].x=p1.x;
way[0].y=p1.y;
//两个转折点
way[1].x=p1.x;
way[1].y=j;
way[2].x=p2.x;
way[2].y=j;
//终点
way[3].x=p2.x;
way[3].y=p2.y;
return true;
}
}
}
//}
return false;
}
void Linker_Matrix::init_search()
{
visited = Matrix< int, M, N >();
index = 0;
turn_count = 0;
}
void Linker_Matrix::auto_play()
{
while( auto_search() );
}
bool Linker_Matrix::man_search(const point p1, const point p2)
{
init_search();
if( find_way( p1, p2 ) )
{
matrix[p1.x][p1.y]=0;
matrix[p2.x][p2.y]=0;
return true;
}
return false;
}
int Linker_Matrix::get_element( int x, int y )
{
return matrix[x][y];
}