硬币收集问题

版权声明:请尊重每一滴汗水,谢谢! https://blog.csdn.net/qq_38853493/article/details/80514606
                                                                  硬币收集问题

      机器人从左上角到右下角对一个格子里面的硬币进行收集,每个格子最多有一枚硬币,机器人只能往下或往右走,某些格子是不允许机器人通过的,求机器人最终收集到的硬币数目以及最优的路径数目。
    (算法设计与分析基础.p225.5):    ps:非oj提交题,谢谢。


@浅夏沫若.code:
#include <iostream>
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;
}

猜你喜欢

转载自blog.csdn.net/qq_38853493/article/details/80514606