Matrix 邻接矩阵邻域

Matrix 邻接矩阵邻域,matrix,graph,breadth-first-search,depth-first-search,connected-components,Matrix,Graph,Breadth First Search,Depth First Search,Connected Components,我有一个0和1的矩阵。我可以从任何细胞开始。我想知道覆盖所有可能的1所需的最小步数(上、下、左、右)是多少。我可以从0或1开始 例如: 0 1 0 1 1 1 0 1 0 从(2,2)开始,在1步内,我可以到达所有1。 我将其与无向图的邻接矩阵联系起来。基本上,当我可以从任何一点出发时,我需要找到最远的邻居。 如果我只能从顶点开始,我可以简单地使用BFS/DFS并保留一个计数器,但是这会带来一个问题。虽然你可以将0/1矩阵视为某些图形的邻接矩阵,在这种特殊情况下,您真正关心的图形是,每个节点

我有一个0和1的矩阵。我可以从任何细胞开始。我想知道覆盖所有可能的1所需的最小步数(上、下、左、右)是多少。我可以从0或1开始

例如:

0 1 0 
1 1 1
0 1 0
从(2,2)开始,在1步内,我可以到达所有1。 我将其与无向图的邻接矩阵联系起来。基本上,当我可以从任何一点出发时,我需要找到最远的邻居。
如果我只能从顶点开始,我可以简单地使用BFS/DFS并保留一个计数器,但是这会带来一个问题。

虽然你可以将0/1矩阵视为某些图形的邻接矩阵,在这种特殊情况下,您真正关心的图形是,每个节点都是矩阵中的一个单元,并且每个节点都与矩阵中与其直接相邻的单元相邻


解决此问题的一个选项是运行多个广度优先搜索,一个从图中的每个节点开始,并记录从每个节点到图中任何1的最大距离。然后,您可以选择使该最大距离最小化的节点。

我的方法是从起始单元格向上和向下扩散,然后在每一行上通过该行向两端扩散,保持迄今为止所采取的步数

通过垂直或水平移动,从起点到单元的所有路线都会产生相同的结果

解决方案

四向解

int mmd8(int h, int w, int g[h][w], int x, int y)
{
    putchar('#');
    return max8(mmd8_up   (h,w,g,x-1,y  ,1),
                mmd8_down (h,w,g,x+1,y  ,1),
                mmd8_left (h,w,g,x  ,y-1,1),
                mmd8_right(h,w,g,x  ,y+1,1),

                mmd8_uleft (h,w,g,x-1,y-1,1),
                mmd8_uright(h,w,g,x-1,y+1,1),
                mmd8_dleft (h,w,g,x+1,y-1,1),
                mmd8_dright(h,w,g,x+1,y+1,1));
}

int mmd8_up(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('U');
    return max4(g[x][y]?steps:0,
           mmd8_up    (h,w,g,x-1,y  ,steps+1),
           mmd8_uleft (h,w,g,x-1,y-1,steps+1),
           mmd8_uright(h,w,g,x-1,y+1,steps+1));
}

int mmd8_down(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('D');
    return max4(g[x][y]?steps:0,
           mmd8_down  (h,w,g,x+1,y  ,steps+1),
           mmd8_dleft (h,w,g,x+1,y-1,steps+1),
           mmd8_dright(h,w,g,x+1,y+1,steps+1));
}

int mmd8_left(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('L');
    return max2(g[x][y]?steps:0,
           mmd8_left (h,w,g,x  ,y-1,steps+1),
           mmd8_uleft(h,w,g,x-1,y-1,steps+1),
           mmd8_dleft(h,w,g,x+1,y-1,steps+1));
}

int mmd8_right(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('R');
    return max2(g[x][y]?steps:0,
           mmd8_right (h,w,g,x  ,y+1,steps+1),
           mmd8_uright(h,w,g,x-1,y+1,steps+1),
           mmd8_dright(h,w,g,x+1,y+1,steps+1));
}

int mmd8_uleft(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('W');
    return max2(g[x][y]?steps:0,
           mmd8_uleft(h,w,g,x-1,y-1,steps+1));
}

int mmd8_uright(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('X');
    return max2(g[x][y]?steps:0,
           mmd8_uright(h,w,g,x-1,y+1,steps+1));
}

int mmd8_dleft(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('Y');
    return max2(g[x][y]?steps:0,
           mmd8_dleft(h,w,g,x+1,y-1,steps+1));
}

int mmd8_dright(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('Z');
    return max2(g[x][y]?steps:0,
           mmd8_dright(h,w,g,x+1,y+1,steps+1));
}
int mmd4(int h, int w, int g[h][w], int x, int y)
{
    putchar('#');
    return max4(mmd_up   (h,w,g,x-1,y  ,1),
                mmd_down (h,w,g,x+1,y  ,1),
                mmd_left (h,w,g,x  ,y-1,1),
                mmd_right(h,w,g,x  ,y+1,1));
}

int mmd_up(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('U');
    return max4(g[x][y]?steps:0,
           mmd_up   (h,w,g,x-1,y  ,steps+1),
           mmd_left (h,w,g,x  ,y-1,steps+1),
           mmd_right(h,w,g,x  ,y+1,steps+1));
}

int mmd_down(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('D');
    return max4(g[x][y]?steps:0,
           mmd_down (h,w,g,x+1,y  ,steps+1),
           mmd_left (h,w,g,x  ,y-1,steps+1),
           mmd_right(h,w,g,x  ,y+1,steps+1));
}

int mmd_left(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('L');
    return max2(g[x][y]?steps:0,
           mmd_left (h,w,g,x  ,y-1,steps+1));
}

int mmd_right(int h, int w, int g[h][w], int x, int y, int steps)
{
    if (base_case(h,w,x,y)) return 0;
    putchar('R');
    return max2(g[x][y]?steps:0,
           mmd_right(h,w,g,x  ,y+1,steps+1));
}
效用函数

int base_case(int h, int w, int x, int y)
{
    if (x < 0) return 1;
    if (y < 0) return 1;
    if (x >= h) return 1;
    if (y >= w) return 1;
    return 0;
}

int max2(int a, int b)
{
    return ((a > b) ? a : b);
}

int max4(int a, int b, int c, int d)
{
    int m = a;
    if (b > m) m = b;
    if (c > m) m = c;
    if (d > m) m = d;
    return m;
}

int max8(int a, int b, int c, int d, int e, int f, int g, int h)
{
    int m = a;
    if (b > m) m = b;
    if (c > m) m = c;
    if (d > m) m = d;
    if (e > m) m = e;
    if (f > m) m = f;
    if (g > m) m = g;
    if (h > m) m = h;
    return m;
}
int基本情况(int h,int w,int x,int y)
{
如果(x<0)返回1;
如果(y<0)返回1;
如果(x>=h)返回1;
如果(y>=w)返回1;
返回0;
}
int max2(int a,int b)
{
返回((a>b)?a:b);
}
intmax4(inta,intb,intc,intd)
{
int m=a;
如果(b>m)m=b;
如果(c>m)m=c;
如果(d>m)m=d;
返回m;
}
intmax8(inta,intb,intc,intd,inte,intf,intg,inth)
{
int m=a;
如果(b>m)m=b;
如果(c>m)m=c;
如果(d>m)m=d;
如果(e>m)m=e;
如果(f>m)m=f;
如果(g>m)m=g;
如果(h>m)m=h;
返回m;
}

具体来说,您遇到了什么问题?我猜这一定是某种标准算法,但不知道使用哪种算法,或者如何解决此问题。我是否应该去每个单元格并使用计数器使用BFS?但是如果我要到一个有0(不是图上的顶点)的单元,我怎么使用DFS呢?解决此问题的任何提示/帮助:给定矩阵,从任意点开始查找步骤,以查找覆盖所有1的步骤数。您的问题没有说明如何最小化步骤数。从一开始到最远的
1
需要多少步?所有步骤的总和?所有
1
访问路径的长度?@someone1我添加了一个8路解决方案,我对这一点比较陌生,有没有可能在聊天中讨论这个问题?只有在你同意的情况下才会变得更简单。我有几个疑问!
int base_case(int h, int w, int x, int y)
{
    if (x < 0) return 1;
    if (y < 0) return 1;
    if (x >= h) return 1;
    if (y >= w) return 1;
    return 0;
}

int max2(int a, int b)
{
    return ((a > b) ? a : b);
}

int max4(int a, int b, int c, int d)
{
    int m = a;
    if (b > m) m = b;
    if (c > m) m = c;
    if (d > m) m = d;
    return m;
}

int max8(int a, int b, int c, int d, int e, int f, int g, int h)
{
    int m = a;
    if (b > m) m = b;
    if (c > m) m = c;
    if (d > m) m = d;
    if (e > m) m = e;
    if (f > m) m = f;
    if (g > m) m = g;
    if (h > m) m = h;
    return m;
}