25分 TLE+WA求助

P3956 [NOIP2017 普及组] 棋盘

```cpp #include <bits/stdc++.h> #define ll long long using namespace std; int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}; int f[110][110],ans,n,m,x,y,c,jl[110][110],jyh[110][110]; void dfs(int x,int y,int k) { if (k>=ans) return; if (jyh[x][y]!=-1) { if (jyh[x][y]<=k) return; } jyh[x][y]=k; if (x==m&&y==m) { if (k<ans) ans=k; return; } for (int i=0;i<=3;i++) if (x+dx[i]<=m&&x+dx[i]>0&&y+dy[i]<=m&&y+dy[i]>0) { if (f[x+dx[i]][y+dy[i]]==f[x][y]) dfs(x+dx[i],y+dy[i],k); else if (f[x+dx[i]][y+dy[i]]==-1) { if (jl[x][y]!=-1) { f[x+dx[i]][y+dy[i]]=0; if (f[x][y]==f[x+dx[i]][y+dy[i]]) dfs(x+dx[i],y+dy[i],k+2); else dfs(x+dx[i],y+dy[i],k+3); f[x+dx[i]][y+dy[i]]=1; if (f[x][y]==f[x+dx[i]][y+dy[i]]) dfs(x+dx[i],y+dy[i],k+2); else dfs(x+dx[i],y+dy[i],k+3); f[x+dx[i]][y+dy[i]]=-1; } } else dfs(x+dx[i],y+dy[i],k+1); } } int main() { scanf("%d%d",&m,&n); for (int i=1;i<=m;i++) for (int j=1;j<=m;j++) f[i][j]=-1,jl[i][j]=-1,jyh[i][j]=-1; for (int i=1;i<=n;i++) { scanf("%d%d%d",&x,&y,&c); f[x][y]=c; jl[x][y]=c; } ans=100000000; dfs(1,1,0); if (ans==100000000) printf("-1"); else printf("%d",ans); } ```
by forever_0805 @ 2021-10-22 12:28:30


自己刚刚打的代码,记忆化做的好一点就可以过了,你的RE是因为你在dfs中的处理有问题,xx=x+dx[i]是有可能会到101的,这样子你的数组就爆掉了
by forever_0805 @ 2021-10-22 12:29:55


|