1 条题解
-
0Takagi-san (njnu19200437) LV 10 MOD @ 2022-04-02 16:41:47
前几天打的一场比赛的E题
https://ac.nowcoder.com/acm/contest/30532/E
原题是要求输出最短步数,用bfs可以做。
改了一下,变为dp问题。设\(dp_{i,j,k}\)是到达点\((i,j)\),花费\(k\)步的方案数,则有
\(dp_{i,j,k} = \sum dp_{i',j',k-1}\),若\((i',j')\)能一步到达\((i,j)\)。
void solve() { int n, m, a, b, c, d, k; cin>>n>>m>>a>>b>>c>>d>>k; auto ok = [&](int x, int y){ return x<=n && x>0 && y<=m && y>0; }; array<int,2> dir8[] = { {2, 1}, {2, -1}, {-2, 1}, {-2, -1}, {1, 2}, {1, -2}, {-1, 2}, {-1, -2} }; dp[a][b][0] = 1; for(int i=1;i<=k;i++) { for(int x=1;x<=n;x++) { for(int y=1;y<=m;y++) { for(auto _: dir8) { int x1 = _[0] + x, y1 = _[1] + y; if(ok(x1, y1)) { dp[x1][y1][i] += dp[x][y][i-1]; } } } } } Mint ans = 0; for(int i=1;i<=k;i++) ans += dp[c][d][i]; cout<<ans<<'\n'; //cout<<dp[c][d][k]<<'\n'; }
- 1
信息
- ID
- 1345
- 难度
- 5
- 分类
- (无)
- 标签
- (无)
- 递交数
- 59
- 已通过
- 19
- 通过率
- 32%
- 被复制
- 3
- 上传者