#include <stdio.h>
#define FALSE 0 //用来标记有未被访问过
#define TRUE 1
#define R 5
#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 j ;
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 j ;
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") ;
}