栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言的数字游戏算法效率问题探讨实例

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言的数字游戏算法效率问题探讨实例

最近做了这样一个题目,感觉挺有趣~题目如下:

问题描述

Winder 最近在玩一个数字游戏,该游戏是在一个n*m 的网格上进行的,每个格子上有 一个数字,代表这个格子的数值。玩家需要从网格的左上角的格子走到右下角的格子,每次 只能向右或者向下走,并且不能回头。玩家每经过一个格子可以选择分值是否加上该格子的 数值,每次游戏的初始分数都是0。

Winder 想知道在每场游戏,他最多能够得到多少分值。但是,Winder 很懒,所以你必 须帮他来完成这件事。

数据输入

输入第一行两个正整数N 和M(0

数据输出

输出一行一个整数,表示该场游戏能取得的最高分数sum。(保证sum 在32 位整数范围 内)。

上面这个问题就是numberGame,考虑到每一步都有且只有向右和向左两个选择,故用递归算法会很方便,代码如下:

复制代码 代码如下:#include
#include
#include
#pragma comment(lib,"winmm.lib")
using namespace std;
int j=0;
int go(int kc,int *Ac,int wc,int nc)
{
    if(kc>=j) return wc;
    if(kc    {
        if((kc+1)%5==0)
            return go(kc+nc,Ac,Ac[kc]+wc,nc);
        else
            return go(kc+1,Ac,Ac[kc]+wc,nc)>go(kc+nc,Ac,Ac[kc]+wc,nc)?go(kc+1,Ac,Ac[kc]+wc,nc):go(kc+nc,Ac,Ac[kc]+wc,nc);
    }
}
void main()
{
    int m,n;
    DWORD   t1,   t2;
    cin>>m>>n;
    int *A,i,w=0;
    A=new int [m*n];
    for(i=0;i    {
        if(i!=0&&i%n==0)cout<        cin>>A[i];
    }
    j=m*n;
    t1=timeGetTime();
    int max=go(0,A,w,n);
    cout<    t2=timeGetTime();
    cout<<"the time it takes:"<}

代码执行时间为46MS,由于最大权值路径上每个节点的前驱只能是其上方的节点或其左边的节点(最左的节点除外),故可用一个一维数组存储每个节点前驱的最大权值,代码如下:

复制代码 代码如下:
#include 
int i,j,dp[16],n,m,v;    
void main(){    
    scanf("%d%d",&n,&m); 
    for(i=0;i         for(j=1;j<=m;j++){    
             scanf("%d",&v);    
             if(dp[j]             dp[j]+= v>0?v:0;                                     
         }    
    printf("%dn",dp[m]);  
}
此代码用了类似迭代的算法,代码执行时间为30MS,可知此代码效率比上面的代码效率高,并且代码要比前者简单的多。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/65774.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号