迷宫最大和

[题目描述] 有一个n*n的迷宫,每个方格里都有着相应的数字。你从左上角出

发,每次可以向上下左右四个方向最多(注意是最多,不是必须)移动k格,

并且要求你每次到达的方格里的数字必须大于上一次所在方格的数字。现在要

求你走过的方格的所有数之和最大,问这个最大和是多少。

 [输入] 输入数据第一行为两个正整数N、K(1<=N<=100,0<=K<=N)接下来的n

行,每行有n个不超过integer范围的整数,表示地图中的数。

 [输出] 输出数据只有一行,为最大的和。

 [输入输出示例]

输入(maze.in) 3 1

2 5 3

6 2 4

7 9 2

 输出(maze.out) 31

 [评分标准] 对于每个测试数据,如果你能够得出正确的答案,那么你将得到

满分,否则得0分。

 

 1 //按题意,若每次移动一格,则最后一个一定是较大的一个数 ,从左上移动到右下,还没找到错误 
 2 #include <iostream>
 3 #include <cstring>
 4 #include <queue>
 5 using namespace std;
 6 
 7 //上下左右 
 8 int pos[4][2] = {-1,0,1,0,0,-1,0,1};
 9 bool vis[100][100] = {0};
10 int sum = 0;
11 queue <int > q;
12 int ans[4];
13 
14 int max(int *ans)
15 {
16     int s = ans[0];
17     for(int i=1; i<4; i++)
18     if(ans[i]>s)
19         s = ans[i];
20     return s;
21 }
22 
23 int bfs(int str[][100],int n,int row,int col)
24 {
25     int ii = row,jj = col;
26     while(!q.empty())
27     {
28         int head = q.front();
29         sum += head;
30         vis[ii][jj] = 1;
31         q.pop();
32         for(int k=0; k<4; k++)
33         {
34             ii += pos[k][0];
35             jj += pos[k][1];
36             bool flag = ii>=0&&ii<n&&jj>=0&&jj<n;
37             if(flag&&!vis[ii][jj]&&str[ii][jj]>str[row][col])
38             {
39                 q.push(str[ii][jj]);
40                 if(ii==n-1&&jj==n-1)
41                 {
42                     if(ans[k]<(ans[k]+str[ii][jj]));
43                         ans[k] = ans[k]+str[ii][jj];
44                     return str[ii][jj];    
45                 }
46                 int temp = sum + bfs(str,n,ii,jj);
47                 if(ans[k]<temp)
48                     ans[k] = temp;                         
49             } 
50             ii = row;
51             jj = col;          
52         }
53     }
54     return  max(ans);    
55 }
56 
57 int main()
58 {
59     int i,j,k;
60     int n;
61     int num[100][100];
62     while(cin>>n)
63     {
64         memset(num,0,sizeof(num));
65         memset(vis,0,sizeof(vis));
66         memset(ans,0,sizeof(ans));
67         vis[0][0] = 1;//访问过了 
68         while(!q.empty())//因为使用了递归,则 队列和结果必须放在全局 
69             q.empty();
70         for(i=0; i<n; i++)
71             for(j=0; j<n; j++)
72             {
73                 cin>>num[i][j];//输入不管正负无关紧要 
74             }
75         int res = 0;
76         q.push(num[0][0]);
77         vis[0][0] = 1;
78         res = bfs(num,n,0,0);
79         cout<<res<<endl;      
80     }
81     return 0;   
82 } 
83  
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 int pos1[4] = {-1,1,0,0};
 6 int pos2[4] = {0,0,-1,1};
 7 int f[105][105] = {0};
 8 
 9 int find(int a[][105], int n,int k, int row, int col)
10 {
11     int i,j;
12     if(f[row][col])//必须要有返回值,否则下次的递归就出不来 
13         return f[row][col];
14     for(i=0; i<4; i++)
15         for(j=1; j<=k; j++)//最多K步,不是必须K步
16         {
17             int t1 = row + pos1[i]*j;
18             int t2 = col + pos2[i]*j;
19             bool flag = t1>=0&&t1<n&&t2>=0&&t2<n;
20             if(flag)
21             {
22                 if(a[t1][t2]>a[row][col]&&find(a,n,k,t1,t2)>f[row][col])
23                     f[row][col] = find(a,n,k,t1,t2);
24             }              
25         }
26     f[row][col] += a[row][col];
27     return f[row][col];
28 }
29 
30 int main()
31 {
32     //freopen("maze.in","r",stdin);
33     //freopen("maze.out","w",stdout);
34     int i,j;
35     int n,k;
36     int a[105][105];
37     cin>>n>>k;
38     for(i=0; i<n; i++)
39         for(j=0; j<n; j++)
40             cin>>a[i][j];
41     int res = find(a,n,k,0,0);
42     cout<<res<<endl;
43     while(1);
44     return 0;
45 }   

 

 

posted @ 2013-01-11 23:51  加拿大小哥哥  阅读(932)  评论(0编辑  收藏  举报