ZOJ 1107FatMouse and Cheese(BFS)

时间:2023-03-10 04:23:10
ZOJ 1107FatMouse and Cheese(BFS)

题目链接

分析: 一个n * n的图,每个点是一个奶酪的体积,从0,0开始每次最多可以走k步,下一步体积必须大于上一步,求最大体积和

 #include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int Max = + ;
const int INF = 0x3f3f3f3f;
int g[Max][Max], dp[Max][Max];
int n, k;
int gx[] = {, , , -};
int gy[] = {, -, , };
struct Node
{
int x, y; };
void bfs(int x, int y)
{
Node node;
node.x = x;
node.y = y;
dp[x][y] = g[x][y];
queue<Node> que;
que.push(node);
int maxn = -INF;
while (!que.empty())
{
node = que.front();
que.pop();
if (dp[node.x][node.y] > maxn)
maxn = dp[node.x][node.y];
for (int i = ; i < ; i++)
{
for (int j = ; j <= k; j++)
{
int fx = node.x + gx[i] * j;
int fy = node.y + gy[i] * j;
if (fx >= && fy >= && fx <= n && fy <= n && g[fx][fy] > g[node.x][node.y])
{
if (dp[fx][fy] < g[fx][fy] + dp[node.x][node.y])
{
dp[fx][fy] = g[fx][fy] + dp[node.x][node.y];
Node temp;
temp.x = fx;
temp.y = fy;
que.push(temp);
}
}
}
}
}
printf("%d\n", maxn);
}
int main()
{
while (scanf("%d%d", &n, &k) != EOF)
{
if (n == - && k == -)
break;
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
scanf("%d", &g[i][j]);
memset(dp, , sizeof(dp));
bfs(, );
}
return ;
}