dp:
令d[i][j][k]表示第i秒在j行k列最多能得到的糖豆数量 最开始初始化d数组为-INF只有起点的第0秒为0
枚举使用时间和坐标从上一秒的上下左右和原地取max 果当前时间%当前位置的糖豆产生时间==0则d++
分层bfs:
将二维平面增加两个维度 一个已经获得的糖豆数量 另一个为当前位置距离下次获得糖豆的剩余时间 进行分层BFS
BFS过程中队列节点记录坐标、已获得数量、已用时间 当已用时间%当前位置t[i][j]==0时则获得一个 标记已经走过的不再重复
dp:
#include
#include
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 20;
const int MAXT = 1e4 + 10;
int a[MAXN][MAXN];
int d[MAXT][MAXN][MAXN]; //第i秒在j行k列最多能得到的糖豆数量
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int n, m, c;
cin >> n >> m >> c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
int xs, ys, xt, yt;
cin >> xs >> ys >> xt >> yt;
memset(d, -0x3f, sizeof(d));
d[0][xs][ys] = 0; //只有起点初始化成0
for (int i = 1; i < MAXT; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= m; k++)
{
d[i][j][k] = d[i - 1][j][k]; //原地
if (j > 1)
d[i][j][k] = max(d[i][j][k], d[i - 1][j - 1][k]); //从前一秒四个方向转移
if (j < n)
d[i][j][k] = max(d[i][j][k], d[i - 1][j + 1][k]);
if (k > 1)
d[i][j][k] = max(d[i][j][k], d[i - 1][j][k - 1]);
if (k < m)
d[i][j][k] = max(d[i][j][k], d[i - 1][j][k + 1]);
if (i % a[j][k] == 0)
d[i][j][k]++; //得到一个
if (d[i][j][k] >= c && j == xt && k == yt) //满足条件
cout << i << endl, exit(0);
}
return 0;
}
分层bfs:
#include
#include
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 20;
const int MAXC = 1200;
int g[MAXN][MAXN];
int vis[MAXN][MAXC][MAXN][MAXN]; //剩余得到时间 数量
int n, m, c;
int xs, ys, xt, yt;
int dir[5][2] = { -1, 0, 1, 0, 0, -1, 0, 1, 0, 0 };
struct node
{
int x, y, k, t; //数量 时间
};
int BFS()
{
queue<node> q;
q.push({ xs, ys, 0, 0 });
vis[0][0][xs][ys] = 1;
while (!q.empty())
{
int x = q.front().x, y = q.front().y, k = q.front().k, t = q.front().t;
q.pop();
for (int i = 0; i < 5; i++)
{
int xx = x + dir[i][0], yy = y + dir[i][1];
if (xx >= 1 && xx <= n && yy >= 1 && yy <= m)
{
int e = 0;
if ((t + 1) % g[xx][yy] == 0)
e = 1; //得到一个
if (k + e >= c && xx == xt && yy == yt)
return t + 1;
if (vis[(t + 1) % g[xx][yy]][k + e][xx][yy])
continue;
vis[(t + 1) % g[xx][yy]][k + e][xx][yy] = 1;
q.push({ xx, yy, k + e, t + 1 });
}
}
}
}
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
cin >> n >> m >> c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &g[i][j]);
cin >> xs >> ys >> xt >> yt;
cout << BFS() << endl;
return 0;
}