关于我《过河卒》艰难的修改过程

这是原来的代码(60分):

#include <bits/stdc++.h>
using namespace std;
unordered_map<long long, unordered_map<long long, long long> > f;
struct D
{
    long long x;
    long long y;
};
D b, m;
int main()
{
    cin >> b.x >> b.y >> m.x >> m.y;
    f[m.x][m.y] = -1;f[m.x + 2][m.y + 1] = -1;f[m.x + 1][m.y + 2] = -1;f[m.x - 1][m.y + 2] = -1;f[m.x - 2][m.y + 1] = -1;f[m.x - 2][m.y - 1] = -1;f[m.x - 1][m.y - 2] = -1;f[m.x + 1][m.y - 2] = -1;f[m.x + 2][m.y - 1] = -1;
    for (long long i = 0; i <= b.x; i++)
    {
        for (long long j = 0; j <= b.y; j++)
        {
            if (f[i][j] == -1)
            {
                f[i][j] = 0;
            }
            else if (i == 0 || j == 0)
            {
                f[i][j] = 1;
            }
            else
            {
                f[i][j] = f[i - 1][j] + f[i][j - 1];
            }
        }
    }
    cout << f[b.x][b.y];
    return 0;
}

啊啊啊啊啊啊啊啊啊啊啊只得了60分啊啊啊啊啊啊啊啊啊啊啊啊
经过艰难的查错后也没发现问题,又不忍心下载数据,于是在洛谷讨论版中发现了这样的大哥↓↓↓
网页捕获_15-5-2023_133311_www.luogu.com.cn

什么意思,用我瞎编的数据演示:

输入3 3 2 0
应该输出1

按照原思路模拟一下:

先生成了这样的表格

11-11
-1
1-1-1
1

继续进行填充

1101
0112
1010
1122

和答案并不一样
因为生成的第一个表格应该为

11-10
-1
0-1-1
0

也就是说如果马的控制点的x0,那么控制点一下的点也不可到达,也就是说方案数为0,但由于在初始化时程序依旧把这些点设为1,所以答案是偏大的.马的控制点的y0时同理.
综上所述我们只需要将f[0][0]设为0即可,不需要将其他点进行设置.

but

经过测试,最终我们的分数反而降低到了40.再次进行分析,借助第一个测试点数据:输入8 6 0 4,输出1617
按照修改后的代码会得到这样的表格:

111111111
123456789
0
0
0
0
-1

右下角我就不算了,数有点大,但是也能看出问题,就是在对最外侧的数据进行计算时出现了-1,也就是说在进行数据推导时读取了x或y为负数的位置,虽然使用map时未赋值的位置默认为0,但是不排除马的控制点在表格外进行赋值,然后在循环时没有置为0,从而影响了表格内的数据.

对代码的修改至此结束,修改后的正确代码在我的上一篇博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值