木瓜地

 

背景 Background
USACO OCT09 4TH
 
描述 Description
Bessie不小心游荡出Farmer John的田地,而走进了相邻的农民的地。她举起一个木瓜,木
瓜对奶牛来说可是不可多得得美味。这个木瓜林像一般的威斯康星州的田地一样被分割成一个
R行C列的网格(1 <= R <= 40, 1 <= C <= 40)。Bessie可以从一个格沿著一条跟X轴或
Y轴平行的直线走到邻接的令一个格。Bessie发现一开始她自己在木瓜林的(1,1),也就是第
一行第一列慢悠悠地咀嚼著木瓜。

Bessie总是用她最信赖地双筒望远镜去数每一个邻接的格的低掛著的木瓜的数目。然后她就游
荡到那个有最多没有被吃掉的木瓜的邻接的格子(保证这洋的格子只有一个)。

按照这种移动方法,最终Bessie总是会在(R,C)停止然后吃掉那裡的木瓜。

给定这个木瓜林的大小及每个格的木瓜数F_ij(1 <= F_ij <= 100), 要求Bessie一共吃了
多少个木瓜。
 
输入格式 InputFormat
* 第一行: 两个空格隔开的整数R和C.

* 第2到R+1行: 第i+1行有C个空格隔开的整数,表示第i行的每个格的水果数。也就是F_i1, 
F_i2, ..., F_iC.
 
输出格式 OutputFormat
* 第一行: 一个单独的整数,表示到Bessie吃完右下角(R,C)的木瓜回到牛棚的时候為止,
一共在木瓜林吃掉了多少个木瓜。
 
样例输入 SampleInput [复制数据]

3 4
3 3 4 5
4 5 3 2
1 7 4 2

 

样例输出 SampleOutput [复制数据]

39

 

数据范围和注释 Hint
Bessie按照下图数字旁边的字母的顺序吃掉木瓜。

     (1,1) ---> (1,C)
(1,1) 3a  3   4g  5h  (1,C)
  |   4b  5c  3f  2i    |
(R,1) 1   7d  4e  2j  (R,C)
     (R,1) ---> (R,C)

她吃了39个木瓜,剩下4个没有吃(也就是说除了2个格幸免於难,剩下的格子都被Bessie扫
荡过了)。
 
简单的搜索,不过是从四个方向搜索变成了找最大值的方向搜索
 
 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[60][60],sum,n,m;
 4 int v[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
 5 void dfs(int x,int y)
 6 {
 7     int x1,y1;
 8     
 9     if(x>n||y>m||x<=0||y<=0)
10     {
11         return ;
12     }
13     sum+=a[x][y];
14     a[x][y]=0;
15     if(x==n&&y==m)
16         return ;
17     int k=0;
18     for(int i=0;i<4;i++)
19     {
20         int xx=x+v[i][0];
21         int yy=y+v[i][1];
22         if(xx<=n||yy<=m||xx>0||yy>0)
23         {
24             
25             if(a[xx][yy]!=0)
26             {    
27                 if(k==0)
28                 {
29                     x1=xx;
30                     y1=yy;
31                     k++;
32                 }
33                 else 
34                 {
35                     if(a[xx][yy]>a[x1][y1])
36                     {
37                         x1=xx;
38                         y1=yy;
39                     }
40                 }
41             }
42         }
43     }
44 //printf("%d\n",sum);
45     dfs(x1,y1);
46     
47     return ;
48     
49 }
50 int main()
51 {
52     int i,j;
53     while(scanf("%d%d",&n,&m)!=EOF)
54     {
55         memset(a,0,sizeof(a));
56         for(i=1;i<=n;i++)
57         {
58             for(j=1;j<=m;j++)
59             {
60                 scanf("%d",&a[i][j]);
61             }
62         }
63         sum=0;
64         dfs(1,1);
65         printf("%d\n",sum);
66     }
67     return 0;
68 }