C 盒状二维阵列中的路由定位

C 盒状二维阵列中的路由定位,c,algorithm,C,Algorithm,我的代码: #include<stdio.h> #include<stdlib.h> int ch,a[100]; static int i=0,j; int checkIfValidCoordinates(int x, int y, int n, char arr[]){ if(x==a[i]&& y==a[i+1]) { i+=2; return 0; } // arr for t

我的代码:

#include<stdio.h>
#include<stdlib.h>
int ch,a[100];
static int i=0,j;
int checkIfValidCoordinates(int x, int y, int n, char arr[]){
    if(x==a[i]&& y==a[i+1])
    {
        i+=2;
        return 0;
    }    
    // arr for this location is invalid
    // then return 0;
    return 1;
}
void path(int u,int v,int n,char arr[],size_t s,size_t p)
{
    ch=1;
    int x;
    j=checkIfValidCoordinates(u,v,n,arr);
    if(j == 0)
        return;
    if(u==(n-1)&&v==(n-1))
    {
        p+=snprintf(arr+p,s-p,"( %d , %d )",u,v);
    }
    else
    {
         p+=snprintf(arr+p,s-p,"( %d , %d ) - ",u,v);
    }
    if(p>=s)
    {
        fprintf(stderr,"Small path\n");
        exit(1);
    }

    if(u==n-1&&v==n-1)
    {
        printf("%s\n",arr);
    }
    else
    {
    {

        if(u<n-1)
        {
            path(u+1,v,n,arr,s,p);
        }
        if(v<n-1)
        {
             path(u,v+1,n,arr,s,p);
        }
        if(u<n-1&&v<n-1)
        {
             path(u+1,v+1,n,arr,s,p);
        }
    }
    }
}
void main()
{
    char arr[1000];
    int size;
    printf("Enter the size of the grid");
    scanf("%d",&size);
    if(size<=0)
    {
        printf("\nInvalid Input");
        exit(1);
    }
    printf("\nEnter the grid points that are offsets");
    here1:
    scanf("%d %d",&a[i],&a[i+1]);
    if(a[i]==-1&&a[i+1]==-1)
    {
        goto here;
    }
    else
    {
    i+=2;
    goto here1;
    }
    here:
    printf("\nThe paths for the robot are\n");
    i=0;
    path(0,0,size,arr,sizeof arr,0);
}
#包括
#包括
int ch,a[100];
静态int i=0,j;
整数校验有效坐标(整数x、整数y、整数n、字符arr[]{
如果(x==a[i]&&y==a[i+1])
{
i+=2;
返回0;
}    
//此位置的arr无效
//然后返回0;
返回1;
}
无效路径(整数u、整数v、整数n、字符arr[],大小s、大小p)
{
ch=1;
int x;
j=检查有效坐标(u、v、n、arr);
如果(j==0)
返回;
如果(u==(n-1)和&v==(n-1))
{
p+=snprintf(arr+p,s-p,(%d,%d)”,u,v);
}
其他的
{
p+=snprintf(arr+p,s-p,(%d,%d)-”,u,v);
}
如果(p>=s)
{
fprintf(stderr,“小路径”);
出口(1);
}
如果(u==n-1&&v==n-1)
{
printf(“%s\n”,arr);
}
其他的
{
{

如果(u您的输入有点不清楚,但基本上您正在尝试这样做

#include<stdio.h>
#include<stdlib.h>
int ch,a[100];
static int i=0;
int checkIfValidCoordinates(int x, int y, int n, char arr[]){
    if(x<0 || y<0 || x>n-1 || y>n-1)
        return 0;
    // arr for this location is invalid
    // then return 0;
    return 1;
}
void path(int u,int v,int n,char arr[],size_t s,size_t p)
{
    if(checkIfValidCoordinates() == 0)
        return;
    if(u==(n-1)&&v==(n-1))
    {
        p+=snprintf(arr+p,s-p,"( %d , %d )",u,v);
    }
    else
    {
         p+=snprintf(arr+p,s-p,"( %d , %d ) - ",u,v);
    }
    if(p>=s)
    {
        fprintf(stderr,"Small path\n");
        exit(1);
    }

    if(u==n-1&&v==n-1)
    {
        printf("%s\n",arr);
    }
    else
    {
        if(u<n-1)
        {
            path(u+1,v,n,arr,s,p);
        }
        if(v<n-1)
        {
             path(u,v+1,n,arr,s,p);
        }
        if(u<n-1&&v<n-1)
        {
             path(u+1,v+1,n,arr,s,p);
        }

    }
}
void main()
{
    char arr[1000];
    int size;
    printf("Enter the size of the grid");
    scanf("%d",&size);
    if(size<=0)
    {
        printf("\nInvalid Input");
        exit(1);
    }
    printf("\nThe paths for the robot are\n");
    i=0;
    path(0,0,size,arr,sizeof arr,0);
}
#包括
#包括
int ch,a[100];
静态int i=0;
整数校验有效坐标(整数x、整数y、整数n、字符arr[]{
if(xn-1)
返回0;
//此位置的arr无效
//然后返回0;
返回1;
}
无效路径(整数u、整数v、整数n、字符arr[],大小s、大小p)
{
如果(checkIfValidCoordinates()==0)
返回;
如果(u==(n-1)和&v==(n-1))
{
p+=snprintf(arr+p,s-p,(%d,%d)”,u,v);
}
其他的
{
p+=snprintf(arr+p,s-p,(%d,%d)-”,u,v);
}
如果(p>=s)
{
fprintf(stderr,“小路径”);
出口(1);
}
如果(u==n-1&&v==n-1)
{
printf(“%s\n”,arr);
}
其他的
{

如果(u您的输入有点不清楚,但基本上您正在尝试这样做

#include<stdio.h>
#include<stdlib.h>
int ch,a[100];
static int i=0;
int checkIfValidCoordinates(int x, int y, int n, char arr[]){
    if(x<0 || y<0 || x>n-1 || y>n-1)
        return 0;
    // arr for this location is invalid
    // then return 0;
    return 1;
}
void path(int u,int v,int n,char arr[],size_t s,size_t p)
{
    if(checkIfValidCoordinates() == 0)
        return;
    if(u==(n-1)&&v==(n-1))
    {
        p+=snprintf(arr+p,s-p,"( %d , %d )",u,v);
    }
    else
    {
         p+=snprintf(arr+p,s-p,"( %d , %d ) - ",u,v);
    }
    if(p>=s)
    {
        fprintf(stderr,"Small path\n");
        exit(1);
    }

    if(u==n-1&&v==n-1)
    {
        printf("%s\n",arr);
    }
    else
    {
        if(u<n-1)
        {
            path(u+1,v,n,arr,s,p);
        }
        if(v<n-1)
        {
             path(u,v+1,n,arr,s,p);
        }
        if(u<n-1&&v<n-1)
        {
             path(u+1,v+1,n,arr,s,p);
        }

    }
}
void main()
{
    char arr[1000];
    int size;
    printf("Enter the size of the grid");
    scanf("%d",&size);
    if(size<=0)
    {
        printf("\nInvalid Input");
        exit(1);
    }
    printf("\nThe paths for the robot are\n");
    i=0;
    path(0,0,size,arr,sizeof arr,0);
}
#包括
#包括
int ch,a[100];
静态int i=0;
整数校验有效坐标(整数x、整数y、整数n、字符arr[]{
if(xn-1)
返回0;
//此位置的arr无效
//然后返回0;
返回1;
}
无效路径(整数u、整数v、整数n、字符arr[],大小s、大小p)
{
如果(checkIfValidCoordinates()==0)
返回;
如果(u==(n-1)和&v==(n-1))
{
p+=snprintf(arr+p,s-p,(%d,%d)”,u,v);
}
其他的
{
p+=snprintf(arr+p,s-p,(%d,%d)-”,u,v);
}
如果(p>=s)
{
fprintf(stderr,“小路径”);
出口(1);
}
如果(u==n-1&&v==n-1)
{
printf(“%s\n”,arr);
}
其他的
{

如果(u对这个问题有一个简单的数学观察,可以避免使用动态规划算法。下面的观察描述了帮助您自己编写代码的过程

首先有一个
NxN
矩阵
M
,其中所有条目都是
-1
。假设
N=3
。矩阵为:

-1 -1 -1
-1 -1 -1
-1 -1 -1
接下来用
0
填充偏移正方形。让(1,1)为偏移正方形,因此我们将其标记为零

-1 -1 -1
-1  0 -1
-1 -1 -1
标记最上面一行的所有
1s
和最左边一列的
1s
*请参见下面的边缘大小写

这里有一个漂亮的数学部分,请注意,在任何给定的位于最上面一行或最左边一列下方的正方形上,到该正方形的路径数是上、左上、左前正方形的总和。
M[i][j]=M[i-1][j]+M[i-1][j-1]+M[i][j-1]
。遍历矩阵,并为每个
-1
平方计算该平方的和,直到到达底部。如果平方为零,则忽略它并继续!

1   1   1
1   0   2
1   2   4
请注意,每个方块都是上方块、左上方块和左上方块的总和。最右下方的方块是从左上原点到右下角可能路径的答案

边缘大小写: 当您将正方形标记为偏移量
0s
时,如果偏移正方形恰好位于顶行或最左边的列中,请将相应的方向标记为以零结尾。例如,假设(0,1)是偏移量
N=3
,则将第0行(0,1)之后(包括)的所有正方形标记为零

1   0   0
1  -1  -1
1  -1  -1

对这个问题有一个简单的数学观察,它避免了动态规划算法。下面是一个观察,它描述了帮助您自己编写代码的过程

首先有一个
NxN
矩阵
M
,其中所有条目都是
-1
。假设
N=3
。矩阵为:

-1 -1 -1
-1 -1 -1
-1 -1 -1
接下来用
0
填充偏移正方形。让(1,1)为偏移正方形,因此我们将其标记为零

-1 -1 -1
-1  0 -1
-1 -1 -1
标记最上面一行的所有
1s
和最左边一列的
1s
*请参见下面的边缘大小写

这里有一个漂亮的数学部分,请注意,在任何给定的位于最上面一行或最左边一列下方的正方形上,到该正方形的路径数是上、左上、左前正方形的总和。
M[i][j]=M[i-1][j]+M[i-1][j-1]+M[i][j-1]
。遍历矩阵,并为每个
-1
平方计算该平方的和,直到到达底部。如果平方为零,则忽略它并继续!

1   1   1
1   0   2
1   2   4
请注意,每个方块都是上方块、左上方块和左上方块的总和。最右下方的方块是从左上原点到右下角可能路径的答案

边缘大小写: 当您将正方形标记为偏移量
0s
时,如果偏移正方形恰好位于顶行或最左边的列中,请将相应的方向标记为以零结尾。例如,假设(0,1)是偏移量
N=3
,则将第0行(0,1)之后(包括)的所有正方形标记为零

1   0   0
1  -1  -1
1  -1  -1

不要使用字符串记录路径。相反,请使用每个步骤的方向数组。如果使用字符数组,则可以使用

#define  RIGHT  1
#define  DOWN   2
/* Down-right is DOWN|RIGHT == RIGHT|DOWN */
请注意,如果矩阵具有
N
×
N
单元,则路径的最大长度为2
N
-2。完整路径的长度从
N
-1(直线对角线路径)到2
N
-2(沿m的两条边)不等