题意:有个n*n的迷宫,每个位置都有一定数量的cheese,每次只能从当前位置向(上,下,左,右)走1-k步,
并且下一个位置要比当前位置的cheese数量多。
问:现在老鼠从位置(0,0)出发,最多能获得多少cheese。
思路:记忆化搜索,递归。
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 105;
int map[MAXN][MAXN];
//保存相应位置的cheese的数量
int dp[MAXN][MAXN];
//dp[i][j]表示从坐标(i,j)出发所能得到的cheese的最大值
int n, k;
//迷宫大小,步伐上限
int bfs(int x,int y)
{
int nextx, nexty, maxval = 0,temp;
//下一个位置的横坐标,纵坐标,整体最大值,临时最大值
if (dp[x][y]!=-1)//记忆化搜索,如果已经算过,直接返回
{
return dp[x][y];
}
for (int i = 1; i <= k; i++)//步伐从1-k
{
nextx = x - i, nexty = y;//向上走
if (nextx >= 0 && map[nextx][nexty] > map[x][y])
{//满足条件:不越界,并且下一个位置比当前位置的cheese数量多
temp = bfs(nextx, nexty);//更新这个方向的最大值
if (temp > maxval)//更新整体最大值
{
maxval = temp;
}
}
nextx = x + i, nexty = y;//向下走
if (nextx < n && map[nextx][nexty] > map[x][y])
{//满足条件:不越界,并且下一个位置比当前位置的cheese数量多
temp = bfs(nextx, nexty);//更新这个方向的最大值
if (temp > maxval)//更新整体最大值
{
maxval = temp;
}
}
nextx = x, nexty = y - i;//向左走
if (nexty >= 0 && map[nextx][nexty] > map[x][y])
{//满足条件:不越界,并且下一个位置比当前位置的cheese数量多
temp = bfs(nextx, nexty);//更新这个方向的最大值
if (temp > maxval)//更新整体最大值
{
maxval = temp;
}
}
nextx = x, nexty = y + i;//向右走
if (nexty < n && map[nextx][nexty] > map[x][y])
{//满足条件:不越界,并且下一个位置比当前位置的cheese数量多
temp = bfs(nextx, nexty);//更新这个方向的最大值
if (temp > maxval)//更新整体最大值
{
maxval = temp;
}
}
}
dp[x][y] = maxval + map[x][y];
//整体最大值+原本位置的数目等于从x,y出发的最大值
return dp[x][y];
}
int main()
{
while (cin >> n >> k)
{
if (n == -1 && k == -1)
{
break;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> map[i][j];
}
}
memset(dp, -1, sizeof(dp));
//初始化为-1,因为map[i][j]的值为0-100
cout << bfs(0, 0) << endl;
}
return 0;
}