“舞蹈家”怀特先生(Dance Dance Revolution)

本文介绍了一种针对DDR舞蹈游戏的算法实现,通过动态规划方法计算玩家在完成一系列箭头指示时所需的最小体力消耗。文章详细展示了状态定义、决策过程及状态转移方程,并提供完整的C语言代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DP,还是DP
  1. #include <stdio.h>
  2. #include <math.h>
  3. #define min(a,b) ((a)<(b)) ? (a) : (b)
  4. #define MAXSIZE 100
  5. int pis[MAXSIZE];//存放要移动的箭头序号
  6. int memory[MAXSIZE][4][4];
  7. int effort(int src, int des)//0原点, 1右,2下,3左, 4上
  8. {
  9.     //决策:
  10.     //中心到目标位置           src==0
  11.     //一只脚移动到相邻位置        (abs(src-des)%2)==1
  12.     //一只脚移动到相对位置        (abs(src-des)%2)==0
  13.     //一只脚在原地再踩一下        src==des
  14.     if (src==des)
  15.         return 1;
  16.     if (src==0)
  17.         return 2;
  18.     if ((abs(src-des)%2)==1)
  19.         return 3;
  20.     if ((abs(src-des)%2)==0)
  21.         return 4;
  22.     return 0;
  23. }
  24. int dp(int n, int lf, int rf)//状态:从左脚位置为lf,右脚位置为rf的状态移动到pis[n]所耗费的体力
  25. {
  26.     if (memory[n][lf][rf]!=-1)
  27.         return memory[n][lf][rf];
  28.     else{
  29.         if (pis[n]==-1){
  30.             memory[n][lf][rf]=0;
  31.             return 0;
  32.         }
  33.         else{
  34.             int val=9000000;
  35.             val=min(val, min(dp(n+1, pis[n], rf)+effort(lf, pis[n]), dp(n+1, lf, pis[n])+effort(rf, pis[n])));//状态转移方程
  36.             memory[n][lf][rf]=val;  
  37.             return val;
  38.         }
  39.     }
  40. }
  41. void InitialAndReadFile()
  42. {
  43.     int i, j, k;
  44.     for (i=0; i<MAXSIZE; i++)
  45.         pis[i]=-1;
  46.     for (i=0; i<MAXSIZE; i++){
  47.         for (j=0; j<4; j++)
  48.             for (k=0; k<4; k++)
  49.                 memory[i][j][k]=-1;
  50.     }
  51.     freopen("ddr.txt""r", stdin);
  52.     i=0;
  53.     while (scanf("%d", &pis[i++])!=EOF)
  54.         ;
  55. }
  56. void OutPut()
  57. {
  58.     int res;
  59.     res=dp(0, 0, 0);
  60.     printf("%d/n", res);
  61. }
  62. main(int argc, char *argv[])
  63. {
  64.     InitialAndReadFile();
  65.     OutPut();
  66. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值