机器人硬币收藏 - 动态编程

时间:2016-07-24 16:10:57

标签: algorithm loops dynamic-programming

机器人硬币收集问题

  

几个硬币被放置在n × m板的单元格中,不超过   每个细胞一枚硬币。一个机器人,位于左上角的单元格中   董事会,需要收集尽可能多的硬币并带来   他们到右下方的细胞。在每一步,机器人都可以移动   向右一个单元格或从当前位置向下一个单元格。什么时候   机器人用硬币访问一个单元格,它总是拿起那个硬币。   设计一种算法来查找机器人可以获得的最大硬币数   收集和执行此操作需要遵循的路径。

     

如何修改硬币的动态编程算法?   如果电路板上的某些电池无法接入,则会收集问题   机器人?将您的算法应用到下面的无法访问的板上   细胞用X表示。有多少最佳路径   板?

     

enter image description here

我为上面的图像编码,并且它在输出显示4时效果很好。不可访问的单元格标记为-1。但是,我使a[0][1]=1可访问,我得到一个奇怪的问题,在初始化后显示a[1][0]=3,输出为6而不是5.如何将单元格a[1][0]显示为3而不是1 ?无论我在a[0][1]处发生什么变化,都会在a[1][0]受到影响。那个怎么样?我哪里错了?

#include <stdio.h>

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

int robot_coin_collect(int m,int n,int a[][n])
{
    int i=1,j=1,k,c[m][n];

    c[0][0]=a[0][0];
    while(a[i][0]!=-1)
    {
        c[i][0]=c[i-1][0]+a[i][0];
        i=i+1;
    }
    for(;i<m;i++)
        c[i][0]=-6;
    while(a[0][j]!=-1)
    {
        c[0][j]=c[0][j-1]+a[0][j];
        j=j+1;
    }
    for(;j<n;j++)
        c[0][j]=-6;

    display(m,n,c);      // after initialising 
    printf("\n\n");

    for(i=1;i<m;i++)
    {
         for(j=1;j<n;j++)
         {
            if(a[i][j]!=-1)
                c[i][j]=max(c[i-1][j],c[i][j-1])+a[i][j];
            else
                c[i][j]=-6;
         }
    } 

    display(m,n,c);      // after the algorithm finishes, result
    return c[m-1][n-1];
}

void display(int m,int n,int c[][n])
{
     int i,j;

     for(i=0;i<m;i++)  
     {   
        for(j=0;j<n;j++)
            printf("%d\t",c[i][j]);
        printf("\n");
    }
}

int main(void) 
{
     int a[5][6]={0,1,0,1,0,0,
                 1,0,0,-1,1,0,
                 0,1,0,-1,1,0,
                 0,0,0,1,0,1,
                 -1,-1,-1,0,1,0};

     printf("%d",robot_coin_collect(5,6,a));
     return 0;
}

2 个答案:

答案 0 :(得分:1)

问题是,当第一行或第一列中没有任何-1时,您的代码可以修改超出数组边界的内存单元格

这很奇怪为什么没有运行时错误,你可以看到this linkthis

在条件中添加绑定限制:

while(i<m && a[i][0]!=-1)
{
    c[i][0]=c[i-1][0]+a[i][0];
    i=i+1;
}

while(j<n && a[0][j]!=-1)
{
    c[0][j]=c[0][j-1]+a[0][j];
    j=j+1;
}

答案 1 :(得分:0)

int CoinCollecting(int c[][], int M[][],int i,int j){
    int Max(int a,int b) 
    {
        return a>b?a:b;
    }
    if(i==0 || j==0)
    {
        M[i][j]=0;
        return 0;
    }
    if(m[i-1][j]<0)
    {
        M[i-1][j]=CoinCollecting(c[][],M[][],i-1,j);
    }

if(m[i][j-1]<0)
{
    M[i][j-1]=CoinCollecting(c[][],M[][],i,j-1);
}

M[i][j]=Max(M[i-1][j],M[i][j-1]+c[i][j]);
return M[i][j]
}