这里可能是因为你混淆了能不能走与该点的方案数。
比如这里:
```cpp
for(int j=1;j<=m;j++)
if(a[i][j]==-1)
a[i][j]++;
```
这里a[i][j]++后是等于0没错,但你大概是想把它当作flag去用,而不是方案数啊。
```cpp
else
a[i][j]=a[i][j-1]+a[i-1][j];
cout<<a[n][m];
```
这里a又是方案数了。
所以我认为应当开两个数组:long long ans和bool flag。这样更为科学。
贴上我的~~AC~~垃圾代码,希望有所帮助。
```cpp
#include <iostream>
using namespace std;
bool chess[23][23];
long long ways[23][23];
int main()
{
ways[0][1]=1;//等效于为第一个点赋初值为1.
int n,m,x,y;
cin>>n>>m>>x>>y;
n++;m++;x++;y++;//move
chess[x][y]=chess[x+1][y+2]
=chess[x+2][y+1]=chess[x+2][y-1]
=chess[x+1][y-2]=chess[x-1][y-2]
=chess[x-2][y-1]=chess[x-2][y+1]
=chess[x-1][y+2]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(chess[i][j]==1) ways[i][j]=0;
else ways[i][j]=ways[i][j-1]+ways[i-1][j];
}
cout<<ways[n][m]<<endl<<endl;
return 0;
}
```
------------
另,万能头文件重名率较高,建议少用。
有什么不对的地方还请多多指教啦~
by koori_sakura @ 2018-07-08 21:57:35
@[RogerDong](/space/show?uid=52826)
啊啊,不好意思,请无视最后的空行……
by koori_sakura @ 2018-07-08 21:58:26