为什么回溯解决方案给出错误的答案
Why is backtracking solution giving the wrong answer?
,因此给出了非阴性整数的2D矩阵,我们必须找到从左上角单元到右下方单元格的最小总路径。我们可以移动的方向是向左,右,顶部和底部。
说矩阵是:请单击此处查看矩阵的图像
现在,绿色的数字是最小总路径中包含的数字。答案是327。我使用djikstra的算法O(n^2(复杂性得到了正确的答案。出于好奇,我尝试使用回溯来解决它。使用访问的矩阵一路保持跟踪和蛮横的态度。我知道这是一种糟糕的方法,但至少应该给出正确的答案。但是我从这种方法中得到的答案是426。
谁能告诉我为什么这种方法给出错误的答案?
#include<bits/stdc++.h>
using namespace std;
#define ROW 5
#define COL 5
int c=0;
int shortest_c = INT_MAX;
bool isSafe(int x,int y,int grid[ROW][COL],bool visit[ROW][COL])
{
if(x<0 || x>=ROW || y<0 || y>=COL || visit[x][y]==true)
return false;
return true;
}
void shortest(int grid[ROW][COL],int x,int y,int val, bool visit[ROW][COL])
{
if(isSafe(x,y,grid,visit))
{
visit[x][y]=true;
val+=grid[x][y];
if(x==ROW-1 && y==COL-1)
{
shortest_c = min(shortest_c,val);
return;
}
shortest(grid,x,y-1,val,visit);
shortest(grid,x,y+1,val,visit);
shortest(grid,x-1,y,val,visit);
shortest(grid,x+1,y,val,visit);
visit[x][y]=false;
}
return;
}
int main()
{
int grid[ROW][COL] =
{
{31, 100, 65, 12, 18},
{10, 13, 47, 157, 6},
{100, 113, 174, 11, 33},
{88, 124, 41, 20, 140},
{99, 32, 111, 41, 20}
};
bool visit[ROW][COL];
for(int i=0;i<ROW;++i)
{
for(int j=0;j<COL;++j)
{
visit[i][j]=false;
}
}
cout<<sum<<endl;
shortest(grid,0,0,0,visit );
cout<<shortest_c<<endl;
return 0;
}
正如我上面说的,我以某种方式收到错误的答案。426而不是327。有人可以告诉我为什么这样?
谢谢!
#include<bits/stdc++.h>
using namespace std;
#define ROW 5
#define COL 5
int c=0;
int shortest_c = INT_MAX;
bool isSafe(int x,int y,int grid[ROW][COL],bool visit[ROW][COL])
{
if(x<0 || x>=ROW || y<0 || y>=COL || visit[x][y]==true)
return false;
return true;
}
void shortest(int grid[ROW][COL],int x,int y,int val, bool visit[ROW][COL])
{
if(isSafe(x,y,grid,visit))
{
val+=grid[x][y];
if(x==ROW-1 && y==COL-1)
{
shortest_c = min(shortest_c,val);
return;
}
visit[x][y]=true;
shortest(grid,x,y-1,val,visit);
shortest(grid,x,y+1,val,visit);
shortest(grid,x-1,y,val,visit);
shortest(grid,x+1,y,val,visit);
visit[x][y]=false;
}
return;
}
int main()
{
int grid[ROW][COL] =
{
{31, 100, 65, 12, 18},
{10, 13, 47, 157, 6},
{100, 113, 174, 11, 33},
{88, 124, 41, 20, 140},
{99, 32, 111, 41, 20}
};
bool visit[ROW][COL];
for(int i=0;i<ROW;++i)
{
for(int j=0;j<COL;++j)
{
visit[i][j]=false;
}
}
cout<<sum<<endl;
shortest(grid,0,0,0,visit );
cout<<shortest_c<<endl;
return 0;
}
上面的代码是正确的代码。我们需要避免将目的地标记为访问的目标。如果这样做,我们将必须接受我们获得的第一种可能性,因为答案可能是正确的。
相关文章:
- 递归求和任务的错误答案
- 为什么我在代码厨师的 CMPRSS 问题中得到 WA(错误答案)?
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 寻找最小楼梯成本的动态规划问题的错误答案
- 为什么可变大小的数组会导致Codechef出现错误答案
- 如何修复此代码对几个测试用例的错误答案?
- 使用幂函数的计算给出了大数字的错误答案
- 快速排序算法,一些特定输入序列的错误答案和分段错误
- 二分法程序的错误答案(C++)
- 无法理解绘图程序中的错误答案
- C++ - 整数除以整数返回错误答案
- 布尔函数的错误答案
- SPOJ FASTFLOW上的错误答案
- 代码的错误答案是在Java Camel案件和C 下划线标识符之间转换的错误答案
- 200万以下所有素数的总和,线程给出错误答案
- 0-1整数背包返回错误答案(动态编程)
- UVa 在线判断 - 3n + 1 - 错误答案
- 提升C++原始算法错误答案
- 二项式系数函数C++错误答案 n>13
- 需要帮助以避免 SPOJ 上的"错误答案"