题目要求

传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角。当然,迷宫中的通路不是平坦的,到处都是陷阱。Dr.Kong决定让他的机器人卡多去探险。
但机器人卡多从左上角走到右下角时,只会向下走或者向右走。从右下角往回走到左上角时,只会向上走或者向左走,而且卡多不走回头路。(即:一个点最多经过一次)。当然卡多顺手也拿走沿路的每个宝物。
Dr.Kong希望他的机器人卡多尽量多地带出宝物。请你编写程序,帮助Dr.Kong计算一下,卡多最多能带出多少宝物。
输入:
第一行: K 表示有多少组测试数据。
接下来对每组测试数据:
第1行: M N
第2~M+1行: Ai1 Ai2 ……AiN (i=1,……,m)
约束条件:
2≤k≤5 1≤M, N≤50 0≤Aij≤100 (i=1,….,M; j=1,…,N)
所有数据都是整数。 数据之间有一个空格。
输出:
对于每组测试数据,输出一行:机器人卡多携带出最多价值的宝物数

详细设计思想

(1)首先这是双进程动态规划问题,假设出发点为A 终点为B,那么,根据题目给出的条件,可以推出A->B的动态转移方程为:
dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + a[i][j]
由于,同理可得B的情况,那么,题目的意思是A->B,然后B->A,我们可以假设同时从A点出发,得到两条不同路径,这个是一样的效果。所以,我们可以得到一个动态转移方程:
dp[i][j][p][q]=max(dp[i-1][j][p-1][q],dp[i-1][j][p][q-1],dp[i][j-1][p-1][q],dp[i][j-1][p][q-1])
因为每次只能移动一步,即 i+1 或j+1 那么 i+j是移动的步数,因为从A点开始移动的,经过相同的步数,肯定能得到i+j = p+q。
(2)因此设计三层循环对每种状态进行遍历,依次遍历第一条路径的前m-1排每个位置,第二条路径在第一条路径下同时进行遍历,将每种可能状态进行遍历。
(3)定义结构体dp_line,其成员包括记录两条最优路径点集的整型指针以及当前状态的宝物总价值。创建四维结构体数组作为状态数组。如图3.1、3.2,通过动态规划的算法思想,根据动态转移方程计算出上一步四种可能性中最多价值宝物数的状态,并将上一步最大状态内记录的点集复制到当前状态的点集中,同时记录当前状态经过的点以及更新最多价值宝物数

(4)最后通过动态转移方程求出最终卡多携带宝物的最大价值,并将每次求出的最优路径中的第一条路线,第二条路线的x轴,y轴坐标分别存入result[map_num]数组中
(5)使用initgraph()函数,初始化图形系统,setlinestyle(PS_SOLID, 2)设置线条的线型为宽度两像素的实线,并根据输入的迷宫规模进行画线。通过result[map_num]数组中存储路线的点集,调用setMap()函数画出卡多获取宝藏所走的路径,其中第一条路径用蓝色颜料显示,第二条路径使用绿色颜料显示

效果图

代码

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include <stdlib.h>struct dp_line {int *x1=NULL;int *y1;int num1=0;int *x2;int *y2;int num2=0;int val_total;
};
struct res {int x1[2500];int x2[2500];int y1[2500];int y2[2500];int number;
};
struct res result[2500];
int a[50][50];//记录宝藏价值
struct dp_line dp[50][50][50][50];//记录两条路径当前状态(位置)得到的宝藏价值
int rs[2500];//记录各组数据的总宝藏价值struct mn {//记录不同组中的m、n值int m;int n;
};struct show_val {//用来显示用来显示这一点的价值char val[5];
};struct show_value {//用来显示这一点的价值show_val a[50][50];
};struct mn mn[50];//记录多少组mn
struct show_value s_value[50];//用来显示不同组的每一点的价值int max_xy(int x, int y) {return ((x) > (y) ? (x) : (y));
}void setMap( int m,int n,int s) {int kk = 0;int x, y = 1;int step = 50;cleardevice();setlinestyle(PS_SOLID, 2);     //画实线,宽度为两像素setcolor(RGB(0, 0, 0));for (int i = 1; i <= n + 1; i++) {x = 1;for (int j = 1; j <= m+ 1; j++) {line(i * step, 1 * step, i * step, (m + 1) * step);line(1 * step, j * step, (n + 1) * step, j * step);x++;kk++;}y++;}for (int k = 0; k < result[s].number; k++) {setfillcolor(YELLOW);solidrectangle(result[s].y1[k] * step, result[s].x1[k] * step, (result[s].y1[k] + 1) * step, (result[s].x1[k] + 1) * step);setfillcolor(GREEN);solidrectangle(result[s].y2[k] * step, result[s].x2[k] * step, (result[s].y2[k] + 1) * step, (result[s].x2[k] + 1) * step);}for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)outtextxy(j * step + 15, i * step + 15, s_value[s].a[i][j].val);}
//int Findsum(int k) {int i, j, p, q, s = 0;int step = 50;int x1 = 0;int y1 = 0;int x2 = 0;int y2 = 0;int num = 0;int map_num = 0;while (k--){  int m, n;scanf("%d %d", &m, &n);mn[num].m = m;mn[num].n = n;for (i = 1; i <= m; i++)for (j = 1; j <= n; j++) {scanf("%d", &a[i][j]);sprintf(s_value[num].a[i][j].val, "%d", a[i][j]);}num++;int g = 0,v=1;for (i = 1; i <= m; i++)//遍历第一条路径前m-1排的每个位置for (j = 1; j <= n; j++)for (p = i + 1; p <= m; p++)//第二条路经在第一条路经下面的一排开始遍历{q = i +  j - p ;//走第二条路径的位置,i+j=p+qif (q >0) {const int N = 200;dp[i][j][p][q].x1 = (int*)malloc(N * sizeof(int));dp[i][j][p][q].y1 = (int*)malloc(N * sizeof(int));dp[i][j][p][q].x2 = (int*)malloc(N * sizeof(int));dp[i][j][p][q].y2 = (int*)malloc(N * sizeof(int));*(dp[i][j][p][q].x1 + dp[i][j][p][q].num1 )= i; *(dp[i][j][p][q].y1 + dp[i][j][p][q].num1) = j;dp[i][j][p][q].num1 ++;*(dp[i][j][p][q].x2 + dp[i][j][p][q].num2) = p;*(dp[i][j][p][q].y2 + dp[i][j][p][q].num2) = q;dp[i][j][p][q].num2++;int max = max_xy(max_xy(dp[i - 1][j][p - 1][q].val_total, dp[i][j - 1][p][q - 1].val_total),max_xy(dp[i - 1][j][p][q-1].val_total, dp[i][j - 1][p - 1][q].val_total));if (max != 0) {if (max == dp[i - 1][j][p - 1][q].val_total) {for (int c = 0; c < dp[i - 1][j][p - 1][q].num1; c++){*(dp[i][j][p][q].x1 + dp[i][j][p][q].num1) = *(dp[i - 1][j][p - 1][q].x1 + c);*(dp[i][j][p][q].y1 + dp[i][j][p][q].num1) = *(dp[i - 1][j][p - 1][q].y1 + c);dp[i][j][p][q].num1++;*(dp[i][j][p][q].x2 + dp[i][j][p][q].num2) = *(dp[i - 1][j][p - 1][q].x2 + c);*(dp[i][j][p][q].y2 + dp[i][j][p][q].num2) = *(dp[i - 1][j][p - 1][q].y2 + c);dp[i][j][p][q].num2++;}}if (max == dp[i][j - 1][p][q - 1].val_total) {for (int c = 0; c < dp[i][j - 1][p][q - 1].num1; c++){*(dp[i][j][p][q].x1 + dp[i][j][p][q].num1) = *(dp[i][j - 1][p][q - 1].x1 + c);*(dp[i][j][p][q].y1 + dp[i][j][p][q].num1) = *(dp[i][j - 1][p][q - 1].y1 + c);dp[i][j][p][q].num1++;*(dp[i][j][p][q].x2 + dp[i][j][p][q].num2) = *(dp[i][j - 1][p][q - 1].x2 + c);*(dp[i][j][p][q].y2 + dp[i][j][p][q].num2) = *(dp[i][j - 1][p][q - 1].y2 + c);dp[i][j][p][q].num2++;}}if (max == dp[i - 1][j][p][q-1].val_total) {for (int c = 0; c < dp[i - 1][j][p][q-1].num1; c++){*(dp[i][j][p][q].x1 + dp[i][j][p][q].num1) = *(dp[i - 1][j][p][q-1].x1 + c);*(dp[i][j][p][q].y1 + dp[i][j][p][q].num1) = *(dp[i - 1][j][p][q-1].y1 + c);dp[i][j][p][q].num1++;*(dp[i][j][p][q].x2 + dp[i][j][p][q].num2) = *(dp[i - 1][j][p][q-1].x2 + c);*(dp[i][j][p][q].y2 + dp[i][j][p][q].num2) = *(dp[i - 1][j][p][q-1].y2 + c);dp[i][j][p][q].num2++;}}if (max == dp[i][j - 1][p - 1][q].val_total) {for (int c = 0; c < dp[i][j - 1][p - 1][q].num1; c++){*(dp[i][j][p][q].x1 + dp[i][j][p][q].num1) = *(dp[i][j - 1][p - 1][q].x1 + c);*(dp[i][j][p][q].y1 + dp[i][j][p][q].num1) = *(dp[i][j - 1][p - 1][q].y1 + c);dp[i][j][p][q].num1++;*(dp[i][j][p][q].x2 + dp[i][j][p][q].num2) = *(dp[i][j - 1][p - 1][q].x2 + c);*(dp[i][j][p][q].y2 + dp[i][j][p][q].num2) = *(dp[i][j - 1][p - 1][q].y2 + c);dp[i][j][p][q].num2++;}}}dp[i][j][p][q].val_total = max_xy(max_xy(dp[i - 1][j][p - 1][q].val_total, dp[i][j - 1][p][q - 1].val_total),max_xy(dp[i - 1][j][p][q-1].val_total, dp[i][j - 1][p - 1][q].val_total)) + a[i][j] + a[p][q];}}int sum = max_xy(max_xy(dp[m - 1][n][m - 1][n].val_total, dp[m - 1][n][m][n - 1].val_total),max_xy(dp[m][n - 1][m - 1][n].val_total, dp[m][n - 1][m][n - 1].val_total));//求这一组最大的权值if (sum == dp[m - 1][n][m][n - 1].val_total) {if(*(dp[m - 1][n][m][n - 1].x1)>=0&& *(dp[m - 1][n][m][n - 1].x1) <= 100){for (int i = 0; i < dp[m - 1][n][m][n - 1].num1; i++) {result[map_num].x1[i] = *(dp[m - 1][n][m][n - 1].x1 + i);result[map_num].x2[i] = *(dp[m - 1][n][m][n - 1].x2 + i);result[map_num].y1[i] = *(dp[m - 1][n][m][n - 1].y1 + i);result[map_num].y2[i] = *(dp[m - 1][n][m][n - 1].y2 + i);result[map_num].number++;}map_num++;}}rs[s++] = sum + a[m][n] + a[1][1];//将这一组数据记录在数组中}return s;
}int main()
{int i, k;scanf("%d", &k);int s = Findsum(k);for (i = 0; i < s; i++) {printf("%d\n", rs[i]);}_getch();initgraph(1200, 1200);setbkcolor(WHITE);for (i =0; i <s; i++) {setMap(mn[i].m, mn[i].n, i);_getch();}printf("\n");return 0;
}

读者大大要是觉得文章不错的话,可以关注一下哦,下方是另一位作者的链接,各位大大不要吝啬自己的关注哦

若颂颂颂颂

探寻宝藏可视化c++相关推荐

  1. NYOJ-712(动态规划)-题目----------------------------- 探寻宝藏

    /*探寻宝藏时间限制:1000 ms | 内存限制:65535 KB描述传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物 ...

  2. 探寻宝藏---双向dp

    题目描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角.当然,迷宫中的通路不是平坦 ...

  3. nyoj 61 传纸条(一) (双线动归)nyoj 探寻宝藏

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列 ...

  4. nyoj 712 探寻宝藏

    探 寻 宝 藏 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处 ...

  5. 探寻宝藏-双进程DP(优化版)

    题目 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角.当然,迷宫中的通路不是平坦的, ...

  6. 探寻宝藏 【算法设计与分析课设】 c语言代码 + 思路详解 + 三维优化

    目录 1.题目 2.思路1 3.代码1 4.思路2 5.代码2 1.题目 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝 ...

  7. 统计表格 + 可视化 ,这个超强绘图技巧值得一看!!

    如何将社会科学(social sciences) 中常用统计分析结果,如:简单和交叉列表频率(simple and cross tabulated frequencies).直方图(histogram ...

  8. 超简单的统计结果可视化工具,推荐~~

    小编在查阅资料时发现一个宝藏可视化包-R-see,该包可以将数据的统计计算结果.模型参数.预测结果以及性能估算等使用合理的可视化方式展现,帮助使用者利用可视化来获得更多信息.可交流和全面的科学报告.话 ...

  9. 快来看看这三款好用的数据可视化软件哪个戳中了你的心巴

    随着数据可视化逐渐走进大众视线,市面上也出现了各种各样的数据可视化软件,那在这纷繁多样的数据可视化产品中,哪些数据可视化产品是真正好用的,又各自有什么特点呢?今天就为大家盘一盘市面上比较火的这三款数据 ...

最新文章

  1. R假设检验之Breusch-Pagan检验(Breusch-Pagan Test)
  2. mysql merge union_MySQLMerge存储引擎
  3. 搜索github项目stars排名
  4. 定时任务--mysql数据库备份
  5. Kafka设计解析(八)- Exactly Once语义与事务机制原理
  6. eth显卡算力2020最新排行_最新三大主流币IPFS比特币ETH挖矿全网算力动态速递单周报(12.3更新)...
  7. [framework] multi learner
  8. 使用NHibernate, Oracle Clob/NClob无法插入
  9. Word高效指南 - WORD的自带模板
  10. 天翼网关密码忘记(猫密码忘记)
  11. 网络广告公司的恐慌 XSS广告终结者(html5新特性)
  12. 三步解决error Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“
  13. 审计小trick结合
  14. 第一章 数字图像基础知识(图像的空间分辨率和幅度分辨率)
  15. XP默认输入法快捷键修复
  16. 还有什么服务器有无限连击,无限元宝动作类变态服有哪些
  17. MPLS流量工程(TE)
  18. java socket多人聊天室_如何运用Java socket实现多人聊天室功能
  19. 显卡组超级计算机,NVIDIA发布全新显卡 在家就能拥有超级计算机
  20. 燕大计算机研究生毕业待遇,研究生人均“月薪上万”是真是假,过来人坦言:想想就好,别认真...

热门文章

  1. 过年用计算机弹奏,过年时你用过这些神技吗?拜年必备的微信表情雨
  2. html左右飘窗高度不一致,飘窗高度偏高应该怎么处理?老师听听傅的经验之谈...
  3. python3sort和sorted
  4. 借贷宝人脸识别无需绑卡,需合作者共同冲刺
  5. 就在今天,微博服务器又双叒叕崩了,微博程序员需要缓口气!
  6. 2017第九届中国金融云发展高峰论坛将于9月在京召开
  7. Airpods连接到windows11突然没有声音了(已解决)
  8. IP Spoof技术
  9. ZOJ 2477 Magic Cube 三阶魔方还原(IDA*)
  10. html网页设计期末大作业——响应式化妆品护肤品网页(11页) web课程设计 网页规划与设计