@[bugwriter](/user/543206) 你的way数组是干嘛用的
by KSA_Khinomov @ 2021-10-02 13:36:41
@[bugwriter](/user/543206) 你把
```cpp
if ((x==1&&y==0)||(x==0&&y==1)) return 1;
```
改成
```cpp
if (x==0&&y==0) return 1;
```
by KSA_Khinomov @ 2021-10-02 13:39:53
@[TOTGOD](/user/479532)
本来想写递推,太麻烦
by lzber @ 2021-10-02 13:58:15
@[TOTGOD](/user/479532)
试过了,输出一毛一样
by lzber @ 2021-10-02 13:58:53
@[bugwriter](/user/543206) 可能是重复走到一个点,然后加了好几次?
建议用递推,如果你用递归的话就会 T 掉,递归的层数太多了
by Carnival @ 2021-10-02 14:34:19
@[bugwriter](/user/543206) 这题正解是dp,建议你写一下递推
by KSA_Khinomov @ 2021-10-03 07:43:25
@[TOTGOD](/user/479532) 写完递推,成功爆0
```CPP
#include<iostream>
using namespace std;
char br[100][100];
int way[100][100];
int bx,by,x,y;
void knight()
{
cin>>x>>y;
if (x-2>=0&&y-1>=0) br[x-2][y-1]='/';
if (x-2>=0&&y+1>=0) br[x-2][y+1]='/';
if (x-1>=0&&y-2>=0) br[x-1][y-2]='/';
if (x+1>=0&&y-2>=0) br[x+1][y-2]='/';
if (x+2>=0&&y-1>=0) br[x+2][y-1]='/';
br[x+2][y+1]='/';
br[x+1][y+2]='/';
br[x][y]='/';
if(x-1>=0&&y+2>=0) br[x-1][y+2]='/';
}
int main()
{
knight();
way[0][0]=1;
for (int i=0;i<=bx;i++) {
for (int j=0;j<=by;j++) {
if (br[i][j]!='/') {
if (i-1>=0) way[i][j]+=way[i-1][j];
if (j-1>=0) way[i][j]+=way[i][j-1];
}
}
}
cout<<way[bx][by]<<endl;
//for (int i=0;i<=9;i++) {
// for (int j=0;j<=9;j++) cout<<br[i][j];
//cout<<endl;
//}
return 0;
}
```
输出和递归一模一样
5个WA
by lzber @ 2021-10-03 12:10:14
@[bugwriter](/user/543206) 来送你篇正解
```cpp
#include<iostream>
#include<cstring>
using namespace std;
long long a[30][30];
int vis[30][30],next[][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
int main(){
int n,m,x,y,nx,ny,i,j;
memset(vis,0,sizeof(vis));
cin>>n>>m>>x>>y;
a[0][0]=0;
vis[x][y]=1;
a[x][y]=0;
for(i=0;i<8;i++){
nx=x+next[i][0];
ny=y+next[i][1];
if(0<=nx&&nx<=n&&0<=ny&&ny<=m){
vis[nx][ny]=1;
a[nx][ny]=0;
}
}
for(i=0;i<=n;i++){
if(vis[i][0]==1)
while(i<=n) i++,a[i][0]=0;
else
a[i][0]=1;
}
for(j=0;j<=m;j++){
if(vis[0][j]==1)
while(j<=m) j++,a[0][j]=0;
else
a[0][j]=1;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(vis[i][j]==0)
a[i][j]=a[i][j-1]+a[i-1][j];
cout<<a[n][m];
return 0;
}
```
by KSA_Khinomov @ 2021-10-03 15:44:15
想过样例的的话,你可以用贪心。
by joeqiao @ 2021-10-06 09:41:26
递归非正解,但我也写了,除了两个tle
其余ac,可看下我的
```cpp
#include<iostream>
#include<cstring>
using namespace std;
int n, m, n0, m0;
long long ans = 0;
bool map[21][21];
void dfs(int u, int x, int y)
{
if (u == n + m) {
ans++;
return;
}
if (x < n) {
if (!map[x][y])
return;
else
dfs(u + 1, x + 1, y);
}
if (y < m) {
if (!map[x][y])
return;
else
dfs(u + 1, x, y + 1);
}
}
int main()
{
memset(map, true, sizeof(map));
cin >> n >> m >> n0 >> m0;
map[n0][m0] = map[n0 + 2][m0 + 1] = map[n0 + 2][m0 - 1] = map[n0 - 2][m0 + 1] = map[n0 - 2][m0 - 1] = map[n0 + 1][m0 + 2] = map[n0 + 1][m0 - 2] = map[n0 - 1][m0 + 2] = map[n0 - 1][m0 - 2] = false;
dfs(0, 0, 0);
cout << ans << endl;
return 0;
}
```
by A_pier @ 2021-10-27 19:57:45