对于一个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.   

    回复人: property1(路标) ( ) 信誉:100  2004-11-17 12:25:00  得分: 0 
     
     
    应该 不难
    递归的话 比较 直接, 如果不想递归, 用一个栈也不难实现注意的是:要记录 某个点 是否已经被判断过,
    可以为每个点天加一个 字段记录 他是否被 检查过,
    --------------------------------------------------------------------
    ////////////////////////////////////////////////////////////////////我认为“记录 某个点 是否已经被判断过”是没有必要的,
    只要记录已经相通的就可以了
      
     
      

  2.   

    给你递归算法!
    ////////////////////////////////////////////////////////////////
    //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);
    }
    }
      

  3.   

    //colAll-------总列数
    //rowAll-------总行数
    好像在你的算法里没用到
      

  4.   

    col+1<colAll 
    row+1<rowAll 
    楼主测试一下,结果保存在Result参数中
      

  5.   

    谢谢handwolf(初学者)
    是我看错了,不好意思^_^