求一算法原理 寻找连通线,参考八后算法递归,可用于验证码去除连续干扰线

叮叮当当当当 2013-04-18 09:46:46

#include <iostream>
using namespace std;

#define M 5
#define N 4
int a[M][N] = {0,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,1,0,1,0};
int b[M] = {};
void genLine(int n)
{
if (n == M)
{
for (int i = 0; i < M; i++)
{
cout<<b[i]<<' ';
}
cout<<endl;
}
if (n==0)
{
for (int j = 0; j < N; j++)
{
if (a[0][j] == 1)
{
b[0] = j;
genLine(n+1);
}
}
}
if (n > 0)
{
int p = b[n-1];
if (b[n-1] > 0 && a[n][b[n-1]-1] == 1){
b[n] = b[n-1]-1;
genLine(n+1);
}
b[n-1] = p;
if (a[n][b[n-1]] == 1){
b[n] = b[n-1];
genLine(n+1);
}
b[n-1] = p;
if (b[n-1] < N && a[n][b[n-1]+1] == 1){
b[n] = b[n-1]+1;
genLine(n+1);
}
}
}

int main (int argc,char** args)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<"----------------------------------"<<endl;
genLine(0);

return 0;
}




0 1 0 1
0 1 1 0
1 1 0 0
1 0 1 0
1 0 1 0
----------------------------------
1 1 0 0 0
1 1 1 0 0 表示红色部分连通路径,第一行1列,第二行1列,第三行1列,第四行0列,第五行0列?这个结论怎么的出来的?上面输出的和这个有啥关系?新手不明白。。。还请指点
1 1 1 2 2
1 2 1 0 0
1 2 1 2 2
3 2 1 0 0
3 2 1 2 2
...全文
551 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
chehw_1 2015-12-11
  • 打赏
  • 举报
回复
关键点: 1. b[M] 是把二维数组(row, col)用一维来表示,用b的下标i表示第i行,用b[i]来表示列; 2. “连通”包括斜线上的连通; 3. 坐标点从0起始。 先看第一个连通线:1 1 0 0 0 可以该写为: b[0] = 1,对应的坐标为(0,1),即第一行的第二个点 b[1] = 1,对应的坐标为(0,1),即第二行的第二个点(在上一个点的正下方) b[2] = 0,对应的坐标为(2,0),即第三行的第一个点(在上一个点的左下方) b[3] = 0,对应的坐标为(3,0),即第四行的第一个点(在上一个点的正下方) b[4] = 0,对应的坐标为(4,0),即第五行的第一个点(在上一个点的正下方) 这五个点可以连成一条通路。 依次类推,其他线也是如此。 生成连通先的算法是自上而下逐行扫描: (0)令i = 0; 从第一行开始扫描; (1)依次判断当前行的每个元素是否为1,如果不为1,则移至下一个元素; (2)如果等于1(可连通),记录当前的列号至b[i],++i; 移至下一行; (3)根据步骤(2)中所记录的列号,依次判断左、中、右三个位置的元素是否为1, (4)如果为1(可连通),则记录该列号至b[i],++i; 移至下一行; 依次类推,直至扫描完所有行。
枯木_叶 2015-12-11
  • 打赏
  • 举报
回复
1 1 1 0 0 下标和数字代表一个坐标 0 1 2 3 4 1 1 1 0 0 第一行第一列 第二行 第一列 第三行第一列 第四行第0列 第五行第0列
赵4老师 2015-09-17
  • 打赏
  • 举报
回复
仅供参考:
/**
 * @Title  老鼠走迷宫的拓展探究
 * @Author 孙琨
 * @Date   2013-11-16
 * @At     XUST
 * @All Copyright by 孙琨
 *
 */

#include <iostream>
using namespace std;

int maze[9][9] = { // 初始化迷宫,英文maze为“迷宫”
    {2,2,2,2,2,2,2,2,2},
    {2,0,0,0,0,0,0,0,2},
    {2,0,2,2,0,2,2,0,2},
    {2,0,2,0,0,2,0,0,2},
    {2,0,2,0,2,0,2,0,2},
    {2,0,0,0,0,0,2,0,2},
    {2,2,0,2,2,0,2,2,2},
    {2,0,0,0,0,0,0,0,2},
    {2,2,2,2,2,2,2,2,2}
};

int startI = 1,startJ = 1; // 入口行列坐标
int endI = 7,endJ = 7;     // 出口行列坐标

void visit(int i,int j)  // 自动搜寻路径
{
    int m,n;

    maze[i][j] = 1;

    if((i == endI) && (j == endJ))
    {
        cout << endl << "显示路径:" << endl;
        for(m=0; m<9; m++)
        {
            for(n=0; n<9; n++)
            {
                if(maze[m][n] == 2)
                    cout << "■";
                else if(maze[m][n] == 1)
                    cout << "♀";
                else
                    cout << "  ";
            }
            cout << endl;
        }
    }

    if(maze[i][j+1] == 0)
        visit(i,j+1);
    if(maze[i+1][j] == 0)
        visit(i+1,j);
    if(maze[i][j-1] == 0)
        visit(i,j-1);
    if(maze[i-1][j] == 0)
        visit(i-1,j);

    maze[i][j] = 0;

}

int main(void)
{
    int i,j;

    cout << "显示迷宫: " << endl;
    for(i=0; i<9; i++)
    {
        for(j=0; j<9; j++)
        {
            if(maze[i][j] == 2)
                cout << "■" ;
            else
                cout << "  " ;
        }
        cout << endl;
    }

    visit(startI,startJ);

    return 0;
}

zeoliteX 2015-09-17
  • 打赏
  • 举报
回复
如果当前点为1,检测上一个点是否为1,是的话b[n]存储a[i][j]的j值,最后输出所有连通线的j值
levindong 2015-08-24
  • 打赏
  • 举报
回复
八皇后貌似能解决
bluewanderer 2013-05-02
  • 打赏
  • 举报
回复
干这种事建议你先去看看OpenCV。 个人认为计算机视觉是软件领域的第二号地狱,保重
叮叮当当当当 2013-05-02
  • 打赏
  • 举报
回复
还是木有答案
叮叮当当当当 2013-04-22
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
引用 2 楼 u010347570 的回复:引用 1 楼 liao05050075 的回复:题目的描述可否再清楚一点 就是他怎么得出第一行1列,第二行1列,第三行1列,第四行0列,第五行0列是连通路径的? 代码挺清楚的。对于相邻两行,如果在相同的列或者相邻列(列号差1)就算连起来了。所以输出的是那些。
还是不懂。。。
叮叮当当当当 2013-04-19
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
引用 2 楼 u010347570 的回复:引用 1 楼 liao05050075 的回复:题目的描述可否再清楚一点 就是他怎么得出第一行1列,第二行1列,第三行1列,第四行0列,第五行0列是连通路径的? 代码挺清楚的。对于相邻两行,如果在相同的列或者相邻列(列号差1)就算连起来了。所以输出的是那些。
求解
FWJ_mag-liebe 2013-04-19
  • 打赏
  • 举报
回复
仙路尽头谁为峰,一见无始道成空!
叮叮当当当当 2013-04-19
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
引用 2 楼 u010347570 的回复:引用 1 楼 liao05050075 的回复:题目的描述可否再清楚一点 就是他怎么得出第一行1列,第二行1列,第三行1列,第四行0列,第五行0列是连通路径的? 代码挺清楚的。对于相邻两行,如果在相同的列或者相邻列(列号差1)就算连起来了。所以输出的是那些。
求解怎么推算出原数组里的连起来的坐标点?
叮叮当当当当 2013-04-18
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
引用 2 楼 u010347570 的回复:引用 1 楼 liao05050075 的回复:题目的描述可否再清楚一点 就是他怎么得出第一行1列,第二行1列,第三行1列,第四行0列,第五行0列是连通路径的? 代码挺清楚的。对于相邻两行,如果在相同的列或者相邻列(列号差1)就算连起来了。所以输出的是那些。
还是不太明白,如何根据输出的这些东西找到原数组里连起来的点的坐标呢
FancyMouse 2013-04-18
  • 打赏
  • 举报
回复
引用 2 楼 u010347570 的回复:
引用 1 楼 liao05050075 的回复:题目的描述可否再清楚一点 就是他怎么得出第一行1列,第二行1列,第三行1列,第四行0列,第五行0列是连通路径的?
代码挺清楚的。对于相邻两行,如果在相同的列或者相邻列(列号差1)就算连起来了。所以输出的是那些。
叮叮当当当当 2013-04-18
  • 打赏
  • 举报
回复
求解
叮叮当当当当 2013-04-18
  • 打赏
  • 举报
回复
引用 1 楼 liao05050075 的回复:
题目的描述可否再清楚一点
原帖地址 http://blog.csdn.net/problc/article/details/5579475
叮叮当当当当 2013-04-18
  • 打赏
  • 举报
回复
引用 1 楼 liao05050075 的回复:
题目的描述可否再清楚一点
就是他怎么得出第一行1列,第二行1列,第三行1列,第四行0列,第五行0列是连通路径的?
liao05050075 2013-04-18
  • 打赏
  • 举报
回复
题目的描述可否再清楚一点

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧