70分 TLE 大佬们救救我啊(有注释)

P3956 [NOIP2017 普及组] 棋盘

我感觉跟题解没什么区别啊?
by GoldenFishX @ 2019-12-17 19:39:20


@[未知用户](/user/156353) 剪枝呢?QWQ
by qian_shang @ 2019-12-17 19:47:01


@[qian_shang](/user/64175) ``` if(jb>minjb[x][y]||jb>=ans)//如果这时的金币已经大于最小值的答案了,那么返回。 return 0; ```
by GoldenFishX @ 2019-12-17 19:48:27


@[未知用户](/user/156353) 好吧,第一次看到把剪枝放这里的
by qian_shang @ 2019-12-17 19:54:34


@[qian_shang](/user/64175) 这不是重点......
by GoldenFishX @ 2019-12-17 19:56:57


@[未知用户](/user/156353) 剪枝没到位啊
by S1gMa @ 2020-03-03 14:18:31


``` #include<bits/stdc++.h> using namespace std; int xx[4]={1,0,0,-1},yy[4]={0,1,-1,0},a[105][105],vis[105][105],ans=2e9,m,n,minjb[105][105]; //a[i][j]表示第i行第j列放的颜色,1 代表黄色, 0代表红色 ,-1表示无色 //?vis[i][j]=0表示没有访问过,=1表示访问过 //第x行第y列 ,mf是否可以有魔法,1表示可以有魔法 ,0表示没有魔法 int dfs(int x,int y,int jb,int mf)//jb是已经用了多少金币 { int nx,ny; if(jb<minjb[x][y]) minjb[x][y]=jb; else return 0; if(x==m&&y==m)//到达终点 { if(jb<ans)//如果金币小于最小值,那么把最小值变成用的金币的个数 ans=jb; return 0; } for(int i=0;i<4;i++) { if(jb>minjb[x][y]||jb>=ans)//如果这时的金币已经大于最小值的答案了,那么返回。 return 0; nx = x + xx[i]; ny = y + yy[i]; if(nx==0||ny==0||nx>m||ny>m||vis[nx][ny]==1||(a[nx][ny]==-1&&mf==0)) { continue; } if(a[nx][ny]==-1&&mf==1)//使用魔法 { vis[nx][ny]=1; a[nx][ny]=a[x][y]; dfs(nx,ny,jb+2,0); a[nx][ny]=-1; vis[nx][ny]=0; } else if(a[x][y]==a[nx][ny])//格子颜色一样 { vis[nx][ny]=1; dfs(nx,ny,jb,1); vis[nx][ny]=0; } else if(a[x][y]!=a[nx][ny])//格子颜色不一样 { vis[nx][ny]=1; dfs(nx,ny,jb+1,1); vis[nx][ny]=0; } } } int main() { vis[1][1]=1; int i,j,x,y,z; cin>>m>>n; for(i=0;i<=m;i++) { for(j=0;j<=m;j++) { a[i][j]=-1; minjb[i][j]=2e9; } } for(i=0;i<n;i++) { cin>>x>>y>>z; a[x][y]=z; } dfs(1,1,0,1); if(ans!=2e9) cout<<ans; else cout<<-1; return 0; } ```
by S1gMa @ 2020-03-03 14:18:49


AC代码
by S1gMa @ 2020-03-03 14:19:27


@[Var1ous](/user/111016) %%%%Orz
by GoldenFishX @ 2020-03-03 14:52:46


|