为什么dfs过不了,有tle和wa,请问有大佬看看吗

P1002 [NOIP2002 普及组] 过河卒

1. 你没开`long long`,会溢出。 2. 考虑到路径数量会有很多(在没有马的时候可能性有$2^{n+m}$种情况),显然$O(2^{n+m})$的$\texttt{DFS}$无法通过,请注意。
by williamwei @ 2023-02-20 09:39:24


我把你的代码改了一下用的是dp的方法实现的。 你看看能不能理解 ``` # include<bits/stdc++.h> using namespace std; #define ll long long int x,y,n,m,sum=0; ll a[25][25]; int dx[8]={-2,-1,1,2,2,1,-1,-2}; int dy[8]={-1,-2,-2,-1,1,2,2,1}; int main() { cin>>n>>m>>x>>y; x++; y++; n++; m++; a[x][y]=-1; for(int i=0;i<8;i++) { if((x+dx[i]>=1&&x+dx[i]<=n)&&(y+dy[i]>=1&&y+dy[i]<=m)) a[x+dx[i]][y+dy[i]] = -1; } a[1][1] = 1; for(int i = 1; i <= n; i++){ for (int j = 1; j <= m; j++){ // cout << a[i][j] << ' '; if(a[i][j] == -1){ a[i][j] = 0; continue; } a[i][j] += a[i-1][j]+a[i][j-1]; } // cout << endl; } cout<<a[n][m]; } ```
by Enguang_Cai @ 2023-02-20 13:38:12


```cpp //代码如下,看看能不能理解: #include<bits/stdc++.h> using namespace std; bool book[30][30]; long long a[30][30]; int x1,x2,y1,y2; int main(){ cin >>x1>>y1>>x2>>y2; book[x2][y2]=1; if(x2>1 && y2!=0) book[x2-2][y2-1]=1; if(x2>1 && y2!=20) book[x2-2][y2+1]=1; if(x2!=0 && y2>1) book[x2-1][y2-2]=1; if(x2!=0 && y2<19) book[x2-1][y2+2]=1; if(x2!=20 && y2>1) book[x2+1][y2-2]=1; if(x2!=20 && y2<19) book[x2+1][y2+2]=1; if(x2<19 && y2!=0) book[x2+2][y2-1]=1; if(x2<19 && y2!=20) book[x2+2][y2+1]=1; for(int i=0;i<=x1;i++){ for(int j=0;j<=y1;j++){ if(book[i][j]!=1){ if(i==0 && j==0) a[0][0]=1; else if(i==0 && j>0) a[0][j]=a[0][j-1]; else if(i>0 && j==0) a[i][0]=a[i-1][0]; else a[i][j]=a[i-1][j]+a[i][j-1]; } } } cout<<a[x1][y1]; return 0; }
by zyc220207 @ 2023-02-21 10:15:36


|