• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
nuoyananman
博客园    首页    新随笔    联系   管理    订阅  订阅

贪吃蛇 C++

现在有一个N*M(N,M=100)的方形矩形,在这个矩形的每一个方格上都放有一个随机值,一条可爱的小蛇从矩形的 左上角开始出发,每次移动都只能移动一格,向右或向下,而每到达一格贪吃的小蛇都会吧该位置上的值吃个一干二净,直到到达右下角时停止。而贪吃的小蛇不怕撑死,它只想吃到最多,并输出路径。

输入行列,输入矩形,以空格键和回车隔开;输出吃的最大量以及路径;

示例:

3 4
15 -4 1 2
-5 9 12 2
20 -2 -3 1

输出:

35
15 -4 9 12 2 1

#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct lujing 
{
	int ml;//记录该位置吃的最大量
	string lu;//记录路径;
};
int main()
{
	int m, n, k; lujing h;
	h.ml = 0; h.lu = "";
	scanf("%d", &m); scanf("%d", &n);//m行,n列;
	vector<vector<lujing>> b(m, vector<lujing>(n, h));
	vector<vector<int>> a(m, vector<int>(n));
	for(int i=0;i<m*n;++i)
	{
		scanf("%d", &k); a[i / n][i % n] = k;
	}
	b[0][0].ml = a[0][0]; b[0][0].lu += to_string(a[0][0]);
	for (int i = 1; i < m; ++i)
	{
		b[i][0].ml = a[i][0] + b[i - 1][0].ml;
		b[i][0].lu = b[i - 1][0].lu;
		b[i][0].lu += " ";
		b[i][0].lu += to_string(a[i][0]);
	}
	for (int i = 1; i < n; ++i)
	{
		b[0][i].ml = a[0][i] + b[0][i-1].ml;
		b[0][i].lu = b[0][i - 1].lu;
		b[0][i].lu += " ";
		b[0][i].lu += to_string(a[0][i]);
	}
	for(int sum=2;sum<m+n-1;++sum)//sum为i,j的和,方便斜着遍历整个地图;
	{
		for(int i=1;i<m;++i)
		{
			if(sum-i<n&&sum-i>0)
			{
				if(b[i - 1][sum - i].ml> b[i][sum - i - 1].ml)h = b[i - 1][sum - i];
				else h = b[i][sum - i - 1];
				b[i][sum - i].ml = h.ml + a[i][sum-i];
				b[i][sum - i].lu = h.lu;
				b[i][sum - i].lu += " ";
				b[i][sum - i].lu += to_string(a[i][sum - i]);
			}
		}
	}
	cout << b[m - 1][n - 1].ml<<endl<< b[m - 1][n - 1].lu;
	return 0;
}

一道较简单题,主要记录路径有点麻烦 

posted @ 2022-03-25 10:02  南蛮入侵  阅读(69)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3