Linker_Matrix::Linker_Matrix(int num ):Matrix< int, M, N >()
{
int m,n;
time_t curtime; //记录当前时间
p1.x = p1.y = 0;
p2.x = p2.y = 0;
index = 0;
time(&curtime);//取得当前时间
srand(curtime);//用当前时间作种子,产生随机数
for( int k=0; k<4; k++ )
way[k].x = way[k].y = 0;
for( int i=1; i<=(M-2)*(N-2)/num; i++ )
for( int j=0; j<num; j++ )
{
do
{
m = rand()%(M-2) + 1;
n = rand()%(N-2) + 1;
}
while( 0==m || 0==n || 0!=matrix[m][n] );
matrix[m][n]=i;
}
}
void Linker_Matrix::show_matrix()
{
for( int i=1; i<M-1; i++ )
{
for( int j=1; j<N-1; j++ )
cout<<matrix[i][j]<<'\t';
cout<<endl;
}
cout<<endl;
}
void Linker_Matrix::count( int low, int high )
{
int *num,k;
//动态分配
num = new int[ high-low+2 ];
//初始化
for( k=0; k<high-low+2; k++ )
num[k]=0;
//计数
for( int i=1; i<M-1; i++ )
for( int j=1; j<N-1; j++ )
num[ matrix[i][j] ]++;
//输出
for( k=0; k<high-low+2; k++ )
cout<<k<<":"<<num[k]<<'\t';
cout<<endl;
//销毁
delete[] num;
}
inline bool Linker_Matrix::is_matched( const point p1, const point p2 )
{
return matrix[ p1.x ][ p1.y ] == matrix[ p2.x ][ p2.y ];
}
bool Linker_Matrix::auto_search()
{
int i,j,m,n;
//static k = 0;
bool all_is_zero = true;//是否所有元素都为0 true:yes false:no
for( i=1; i<M-1; i++ )
for( j=1; j<N-1; j++ )
{
if( matrix[i][j]!=0 )//元素不为0时方进行配对
{
all_is_zero=false;
p1.x = i; p1.y = j;
for( m=1; m<M-1; m++ )
for( n=1; n<N-1; n++ )
{
if( i!=m || j!=n )//元素不为本身时,方进行搜索路径
{
//k++;
p2.x=m; p2.y=n;
init_search();
/*if(k==29)
{
init_search();
show_matrix();
}*/
if ( is_matched( p1, p2 ) && find_way( p1, p2 ) )
/*逻辑式这样写的原因是只要is_matched(p1,p2)为false,
逻辑式必为false,find_way(p1,p2)就不会执行;
当两元素数值相同且有路径时,执行下面
*/
{
//show_matrix();
//cout<<turn_count<<endl;
//matrix[ p1.x ][ p1.y ] = 0;
//matrix[ p2.x ][ p2.y ] = 0;
//k++;
//cout<<p1.x<<' '<<p1.y<<' '<<p2.x<<' '<<p2.y<<':'<<k<<endl;
//show_matrix();
//count(1,21);
//goto jump;
//找到一个就退出
return true;
//}
}
}/*
if( k>MAX)//搜索次数过大,强制跳出
return false;*/
}
}
//jump: ;
}
if( true==all_is_zero )//元素全部为0,返回false
return false;
return false;//没有匹配时,返回false
}
bool Linker_Matrix::find_way( point p1, point p2 )
{
/*
本方法是本程序的核心算法,
作用是以p1为起点,p2为终点进行路径的搜索;*/
/*采用水平垂直扫描法,先确定两个转折点之间是否相通,再判断
转折点与相应端点间是否相通
*/
int i,j;
int px1,px2,py1,py2;
int temp;
bool x_across,y_across;