求助3T+3A+14W

P3956 [NOIP2017 普及组] 棋盘

我用的是记忆化搜索 代码: ```cpp //洛谷P3956 //题目链接:https://www.luogu.com.cn/problem/P3956 #include<iostream> #include<cstdio> using namespace std; const int MAXN=105; int dx[5]={0,1,0,-1}, dy[5]={1,0,-1,0}; int n,m,cnt,ans; int g[MAXN][MAXN]; int mem[MAXN][MAXN]; void dfs(int x,int y,bool f){ if(x==n&&y==n){ mem[x][y]=min(mem[x][y],cnt); return; } else{ mem[x][y]=min(mem[x][y],cnt); for(int i=0;i<=3;++i){ int xx=dx[i]+x; int yy=dy[i]+y; if(xx>0&&xx<=n&&yy>0&&yy<=n){ if(g[xx][yy]!=-1){ if(g[x][y]==g[xx][yy]){ if(cnt<mem[xx][yy]) dfs(xx,yy,1); } else{ if(cnt+1<mem[xx][yy]){ cnt+=1; dfs(xx,yy,1); cnt-=1; } } } else{ if(f){ if(cnt+2<mem[xx][yy]){ cnt+=2; g[xx][yy]=g[x][y]; dfs(xx,yy,0); g[xx][yy]=-1; cnt-=2; } } } } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){ g[i][j]=-1; mem[i][j]=0x3f3f3f3f; } for(int i=1;i<=m;++i){ int x,y,t; scanf("%d%d%d",&x,&y,&t); g[x][y]=t; } mem[1][1]=0; dfs(1,1,1); if(mem[n][n]!=0x3f3f3f3f) printf("%d\n",mem[n][n]); else printf("-1\n"); return 0; } ```
by Eliboy @ 2023-05-28 19:37:22


|