这是原来的代码(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分啊啊啊啊啊啊啊啊啊啊啊啊
经过艰难的查错后也没发现问题,又不忍心下载数据,于是在洛谷讨论版中发现了这样的大哥↓↓↓
什么意思,用我瞎编的数据演示:
输入3 3 2 0
应该输出1
按照原思路模拟一下:
先生成了这样的表格
1 | 1 | -1 | 1 |
---|---|---|---|
-1 | |||
1 | -1 | -1 | |
1 |
继续进行填充
1 | 1 | 0 | 1 |
---|---|---|---|
0 | 1 | 1 | 2 |
1 | 0 | 1 | 0 |
1 | 1 | 2 | 2 |
和答案并不一样
因为生成的第一个表格应该为
1 | 1 | -1 | 0 |
---|---|---|---|
-1 | |||
0 | -1 | -1 | |
0 |
也就是说如果马的控制点的x0,那么控制点一下的点也不可到达,也就是说方案数为0,但由于在初始化时程序依旧把这些点设为1,所以答案是偏大的.马的控制点的y0时同理.
综上所述我们只需要将f[0][0]设为0即可,不需要将其他点进行设置.
but
经过测试,最终我们的分数反而降低到了40.再次进行分析,借助第一个测试点数据:输入8 6 0 4,输出1617
按照修改后的代码会得到这样的表格:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | ||||||||
0 | ||||||||
0 | ||||||||
0 | ||||||||
-1 |
右下角我就不算了,数有点大,但是也能看出问题,就是在对最外侧的数据进行计算时出现了-1,也就是说在进行数据推导时读取了x或y为负数的位置,虽然使用map时未赋值的位置默认为0,但是不排除马的控制点在表格外进行赋值,然后在循环时没有置为0,从而影响了表格内的数据.