轩辕互动Exoweb笔试题(二):小猪吃米

1        小猪吃米

题目:在国际象棋的棋盘上面有 NxN个格。每个格里面有若干的米粒。一只小猪站在1x1的格里,小猪每次只能向高位的列或行移动。小猪会吃掉所经过的格子里面所有的米粒。请编写程序计算小猪能吃掉的米粒的最大值。

 

假设小猪从(0,0)开始到棋盘上任一点(m,n)所能吃到的最多米粒数为f(m,n),则f(m,n)满足下列关系式:

f(m,n)=max{f(m,n-1), f(m-1,n)} + Matrix[m][n];

 

注意:

f(0,j) = f(0, j-1) + matrix[0][j], 0<=j<=N-1

f(i,0) = f(i-1, 0) + matrix[i][0], 0<=i<=N-1

上面分析的思路实际上是典型的动态规划思路。

 

源程序:

#include <stdio.h>

#define MAX(a, b) ((a > b) ? a : b)

int matrix[4][4] = {{2,2,3,0},

                            {0,3,1,1},

                            {1,2,2,1},

                            {4,1,2,2}};

int count[4][4];

 

void initialize (void)

{

      count[0][0] = matrix[0][0];  

      int i = 0;

      for ( ; i < 4; ++i )

      {

           count[0][i] = count[0][i-1] + matrix[0][i];

           count[i][0] = count[i-1][0] + matrix[i][0];

      }

}

 

int find_max (int i, int j)

{

      if ( i == 0 )

      {

           return count[0][j];

      }

      else if ( j == 0 )

      {

           return count[i][0];

      }

     

      int count1 = find_max (i, j-1);

      int count2 = find_max (i-1, j);

      count[i][j] = matrix[i][j] + MAX (count1, count2);

      return count[i][j];

}

 

void print_path (int i, int j)

{

      if ( i >= 0 && j >= 0 )

      {

           if ( count[i][j] == count[i-1][j] + matrix[i][j] )

           {

                 print_path (i-1, j);

           }

           else if ( count[i][j] == count[i][j-1] + matrix[i][j] )

           {

                 print_path (i, j-1);

           }

           printf ("(%d,%d)->", i, j);    

      }

}

 

void print (void)

{

      for ( int i = 0; i < 4; ++i )

      {

           for ( int j = 0; j < 4; ++j )

           {

                 printf ("%d/t", count[i][j]);

           }         

           printf ("/n");

      }

}

 

int main (void)

{

      initialize ();

     

      int max_num = find_max (3, 3);

      printf ("count = %d/n", max_num);

     

      print ();

      printf("/nThe path is:/n");

      print_path (3, 3);

      putchar ('/n');   

 

      return 0;

}

 

运行结果:

count = 15

2    4    7    7

2    7    8    9

3    9    11   12

7    10   13   15

The path is:

(0,0)->(0,1)->(1,1)->(2,1)->(2,2)->(3,2)->(3,3)->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值