中兴捧月 俄罗斯套娃奖品

#include <stdio.h>

#define  FALSE 0   //用来标记有未被访问过 
#define  TRUE 

#define R 
#define C  5

#define flag1 -10

#define  Max_Size 100

#define MAX(x,y) ((x) > (y) ? (x) : (y)) 

int visited[Max_Size][Max_Size] ;

 
int A[R][C]    1,   16,   15,   14,   13,
        2,   17,   24,   23,   12,
     3,   18,   25,   22,   11,
     4,   19,   20,   21,   10,
        5,    6,    7,    8,    9

    


;
 

 

int flag[R][7*C]        



int fun(int i,int j)
{

 

 if(i<0 || j<0 || i>=R || j>=C){
  return 0 ;
 }

 if(visited[i][j]){
  return 0 ;
 }

 visited[i][j] = TRUE ;


 if((flag[i][7*j+1])== -1 && (flag[i][7*j+2])==-1 && (flag[i][7*j+3])==-1 && (flag[i][7*j+4])==-1){
  visited[i][j] = FALSE ;
  return A[i][j] ;
 }

 else{

  int sum1 = 0 ;
  int sum2 = 0 ;
  int sum3 = 0 ;
  int sum4 = 0 ;
  if(flag[i][7*j+1]!=-1){
   sum1 = fun(i-1,j) ;
  }
  
  if(flag[i][7*j+2]!=-1){
   sum2 = fun(i,j-1) ;
  }

  if(flag[i][7*j+3]!=-1){
   sum3 = fun(i+1,j) ;
  }

  if(flag[i][7*j+4]!=-1){
   sum4 = fun(i,j+1) ;
  }

 int a = MAX(sum1,sum2) ;
 int b = MAX(sum3,sum4) ;
 
 a = MAX(a,b) ;
 if(a == sum1 && a>0){
  flag[i][7*j+5] = i-1 ;
  flag[i][7*j+6] = j  ;
 }
 if(a == sum2 && a>0){
  flag[i][7*j+5] = i  ;
  flag[i][7*j+6] = j-1 ;
 
 }
 if(a == sum3 && a>0){
  flag[i][7*j+5] = i+1 ;
  flag[i][7*j+6] = j  ;
 }
 if(a == sum4 && a>0){
  flag[i][7*j+5] = i  ;
  flag[i][7*j+6] = j+1 ;
 }

  a = a + A[i][j] ;
 
 
 visited[i][j] = FALSE ;
  return a ;

 }


}

void initm()
{
 int i ;
 int ;
 for(i=0 ; i<R ;i++){
  for(j=0 ; j<C ; j++){     //A[i][j]=>flag[i][6*j] 
   flag[i][7*j] = A[i][j] ;
   flag[i][7*j+5] = flag1 //标志flag1
   flag[i][7*j+6] = flag1 //标志flag1 , 指向下一个节点

   if(i-1>=0 && A[i-1][j] > A[i][j]){
    flag[i][7*j+1] = A[i-1][j] ;
   }
   if(i+1<R && A[i+1][j] > A[i][j]){
    flag[i][7*j+3] = A[i+1][j] ;
   }
   if(j-1>=0 && A[i][j-1] > A[i][j]){
    flag[i][7*j+2] = A[i][j-1] ;
   }
   if(j+1<C && A[i][j+1] > A[i][j]){
    flag[i][7*j+4] = A[i][j+1] ;
   }
  }
 }
}

void init()
{
 int i,j ;
 for(i=0 ; i<R;i++){
  for(j=0 ;j<7*C;j++){
   flag[i][j] = -1 ;
  }
 }
}

void printfnode(int i,int j)
{
 printf("(%d,%d)  ",i,j) ;
 int a = flag[i][7*j+5] ;
 int b = flag[i][7*j+6] ;
 if(a!=flag1 && b!=flag1){
  printfnode(a,b) ;
 }
}

void printfvalue(int i,int j)
{
 printf("%d  ",A[i][j]) ;
 int a = flag[i][7*j+5] ;
 int b = flag[i][7*j+6] ;
 if(a!=flag1 && b!=flag1){
  printfvalue(a,b) ;
 }
}



void main()
{
 
 int i ;
 int ;
 int k ;

 init() ;
 
 initm() ;


 
 printf("\n\n\n") ;


 int sum = fun(0,0) ;

 printf("%d\n",sum) ;

// printfnode(0,0) ;
 printfvalue(0,0) ;
 printf("\n") ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值