机器人硬币收集问题
几个硬币被放置在
n × m
板的单元格中,不超过 每个细胞一枚硬币。一个机器人,位于左上角的单元格中 董事会,需要收集尽可能多的硬币并带来 他们到右下方的细胞。在每一步,机器人都可以移动 向右一个单元格或从当前位置向下一个单元格。什么时候 机器人用硬币访问一个单元格,它总是拿起那个硬币。 设计一种算法来查找机器人可以获得的最大硬币数 收集和执行此操作需要遵循的路径。如何修改硬币的动态编程算法? 如果电路板上的某些电池无法接入,则会收集问题 机器人?将您的算法应用到下面的无法访问的板上 细胞用X表示。有多少最佳路径 板?
我为上面的图像编码,并且它在输出显示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;
}
答案 0 :(得分:1)
问题是,当第一行或第一列中没有任何-1时,您的代码可以修改超出数组边界的内存单元格
这很奇怪为什么没有运行时错误,你可以看到this link和this
在条件中添加绑定限制:
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]
}