硬币收集问题
机器人从左上角到右下角对一个格子里面的硬币进行收集,每个格子最多有一枚硬币,机器人只能往下或往右走,某些格子是不允许机器人通过的,求机器人最终收集到的硬币数目以及最优的路径数目。
(算法设计与分析基础.p225.5): ps:非oj提交题,谢谢。
@浅夏沫若.code:
#include <iostream>
using namespace std;
struct Node
{
int value=INT_MAX;
int pathNum = 0;
}map[101][101];
using namespace std;
struct Node
{
int value=INT_MAX;
int pathNum = 0;
}map[101][101];
int main()
{
int m = 0,n=0; //m,n表示格子为m*n型的,0<=m<=100,0<=n<=100;
cout << "输入格子行列数:";
cin >> m>>n;
cout << "输入格子硬币分布:" << endl;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
cin >> map[i][j].value; //0表示为空位,1表示有硬币,20000表示不可达。
for(int i=1;i<=m;i++)
for (int j = 1; j <= n; j++)
{
if (map[i - 1][j].value == INT_MAX && map[i][j - 1].value == INT_MAX) //左上都有障碍
{
if (map[i][j].value != 0&&map[i][j].value!=INT_MAX) //此位置有硬币
map[i][j].pathNum++;
}
else if (map[i - 1][j].value == INT_MAX && map[i][j - 1].value != INT_MAX) //左边有障碍,右边无障碍
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value += map[i][j - 1].value;
map[i][j].pathNum = map[i][j - 1].pathNum;
}
}
else if (map[i - 1][j].value != INT_MAX && map[i][j - 1].value == INT_MAX) //左边无障碍,右边有障碍
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value += map[i - 1][j].value;
map[i][j].pathNum = map[i - 1][j].pathNum;
}
}
else if (map[i - 1][j].value == map[i][j - 1].value) //两边无障碍,值相等
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value = map[i][j - 1].value;
map[i][j].pathNum = map[i][j - 1].pathNum + map[i - 1][j].pathNum;
}
}
else if (map[i - 1][j].value > map[i][j - 1].value) //两边无障碍,左值大
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value += map[i - 1][j].value;
map[i][j].pathNum = map[i - 1][j].pathNum;
}
}
else if (map[i - 1][j].value < map[i][j - 1].value) //两边无障碍,右值大
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value += map[i][j - 1].value;
map[i][j].pathNum = map[i][j - 1].pathNum;
}
}
}
if (map[m][n].value == INT_MAX)
{
cout << "收集硬币总数:" << "0" << endl;
cout << "最优路径总数:" << "0" << endl;
}
else
{
cout << "收集硬币总数:" << map[m][n].value << endl;
cout << "最优路径总数:" <<map[m][n].pathNum<< endl;
}
return 0;
}
{
int m = 0,n=0; //m,n表示格子为m*n型的,0<=m<=100,0<=n<=100;
cout << "输入格子行列数:";
cin >> m>>n;
cout << "输入格子硬币分布:" << endl;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
cin >> map[i][j].value; //0表示为空位,1表示有硬币,20000表示不可达。
for(int i=1;i<=m;i++)
for (int j = 1; j <= n; j++)
{
if (map[i - 1][j].value == INT_MAX && map[i][j - 1].value == INT_MAX) //左上都有障碍
{
if (map[i][j].value != 0&&map[i][j].value!=INT_MAX) //此位置有硬币
map[i][j].pathNum++;
}
else if (map[i - 1][j].value == INT_MAX && map[i][j - 1].value != INT_MAX) //左边有障碍,右边无障碍
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value += map[i][j - 1].value;
map[i][j].pathNum = map[i][j - 1].pathNum;
}
}
else if (map[i - 1][j].value != INT_MAX && map[i][j - 1].value == INT_MAX) //左边无障碍,右边有障碍
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value += map[i - 1][j].value;
map[i][j].pathNum = map[i - 1][j].pathNum;
}
}
else if (map[i - 1][j].value == map[i][j - 1].value) //两边无障碍,值相等
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value = map[i][j - 1].value;
map[i][j].pathNum = map[i][j - 1].pathNum + map[i - 1][j].pathNum;
}
}
else if (map[i - 1][j].value > map[i][j - 1].value) //两边无障碍,左值大
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value += map[i - 1][j].value;
map[i][j].pathNum = map[i - 1][j].pathNum;
}
}
else if (map[i - 1][j].value < map[i][j - 1].value) //两边无障碍,右值大
{
if (map[i][j].value != INT_MAX)
{
map[i][j].value += map[i][j - 1].value;
map[i][j].pathNum = map[i][j - 1].pathNum;
}
}
}
if (map[m][n].value == INT_MAX)
{
cout << "收集硬币总数:" << "0" << endl;
cout << "最优路径总数:" << "0" << endl;
}
else
{
cout << "收集硬币总数:" << map[m][n].value << endl;
cout << "最优路径总数:" <<map[m][n].pathNum<< endl;
}
return 0;
}