对于一个n*n的矩阵,相邻两个数字相同称他们为相通(不包括斜线方向),现在随机选择一点,请设计一个算法来搜索所有与此点直接和间接相通的点序列。
1 1 1 1 1 1 1 1 1 1
1 1 2 2 3 1 2 3 2 1
1 1 2 3 3 1 2 1 2 1
1 2 3 3 2 2 1 3 2 1
1 1 2 2 3 3 2 1 1 2
2 3 3 2 1 2 2 2 1 2
2 3 2 3 2 3 3 2 2 2
1 3 2 1 3 2 1 2 2 1
1 1 2 1 2 2 1 2 1 2
1 2 1 2 3 2 2 1 2 3
比如上面的10*10矩阵(从0计数),指定(3,3)这一点,与它相通的序列是(3,3),(3,2),(4,2),(4,1),(2,3)请解答上述问题,谢谢!
1 1 1 1 1 1 1 1 1 1
1 1 2 2 3 1 2 3 2 1
1 1 2 3 3 1 2 1 2 1
1 2 3 3 2 2 1 3 2 1
1 1 2 2 3 3 2 1 1 2
2 3 3 2 1 2 2 2 1 2
2 3 2 3 2 3 3 2 2 2
1 3 2 1 3 2 1 2 2 1
1 1 2 1 2 2 1 2 1 2
1 2 1 2 3 2 2 1 2 3
比如上面的10*10矩阵(从0计数),指定(3,3)这一点,与它相通的序列是(3,3),(3,2),(4,2),(4,1),(2,3)请解答上述问题,谢谢!
应该 不难
递归的话 比较 直接, 如果不想递归, 用一个栈也不难实现注意的是:要记录 某个点 是否已经被判断过,
可以为每个点天加一个 字段记录 他是否被 检查过,
--------------------------------------------------------------------
////////////////////////////////////////////////////////////////////我认为“记录 某个点 是否已经被判断过”是没有必要的,
只要记录已经相通的就可以了
////////////////////////////////////////////////////////////////
//Source----表示数据矩形
//Result----表示结果(是否连通),true-是,false-否
//colAll-------总列数
//rowAll-------总行数
//col-------被求点的列
//row-------被求点的行
void GetConnect(int** Source,bool** Result,int colAll,int rowAll,int col, int row)
{
//left
if(col-1>0 && Source[col-1][row]==Source[col][row]){
Result[col-1][row] = true;
GetConnect(Source,Result,colAll,rowAll,col-1, row);
}
//right
if(col+1<colAll && Source[col+1][row]==Source[col][row]){
Result[col+1][row] = true;
GetConnect(Source,Result,colAll,rowAll,col+1, row);
}
//top
if(row-1>0 && Source[col][row-1]==Source[col][row]){
Result[col][row-1] = true;
GetConnect(Source,Result,colAll,rowAll,col, row-1);
}
//bottom
if(row+1<rowAll && Source[col][row+1]==Source[col][row]){
Result[col][row+1] = true;
GetConnect(Source,Result,colAll,rowAll,col, row+1);
}
}
//rowAll-------总行数
好像在你的算法里没用到
row+1<rowAll
楼主测试一下,结果保存在Result参数中
是我看错了,不好意思^_^