dfs代码60分TLE,求助!!!

P3956 [NOIP2017 普及组] 棋盘

@[Adis_FireDevil](/user/115067) 我建议你再开一个数组,用来存到达每个点的最少步数。
by GoldenFishX @ 2019-11-13 20:38:06


@[Adis_FireDevil](/user/115067) 看我用<======指的部分
by GoldenFishX @ 2019-11-13 20:43:31


``` #include<bits/stdc++.h> using namespace std; int df5[111][111],n,k,mingold[111][111]; //<==== //df5记录每一个点的颜色 bool bd[111][111]; //bd[i][j]数组记录df5[i][j]是否走过 int way[5][3]= {{0,0,0},{0,0,1},{0,0,-1},{0,1,0},{0,-1,0}}; //way数组为可以移动的方向 int ans=1000000000; int dfs(int x,int y,int nomagic,int gold,int color) { //x,y为横纵坐标,nomagic为是否能用魔法,gold指需要的金币,color指当前的颜色 //对于nomagic变量,若为1则不能用魔法,0则能用魔法 if(x<=0||x>n||y<=0||y>n)return 0; //判断是否超出边界 if(gold>mingold[x][y])//<===//判断是否已不是最优解 return 0; else mingold[x][y]=gold;//<==== if(bd[x][y])return 0; //判断该点是否走过 if(x==n&&y==n) { ans=gold; //记录答案,一定是最优解 return 0; } bd[x][y]=true; //记录该点已走过 for(int i=1; i<=4; i++) { int xx=x+way[i][1],yy=y+way[i][2]; if(!nomagic&&df5[xx][yy]==0)dfs(xx,yy,1,gold+2,color); else if(df5[xx][yy]==color)dfs(xx,yy,0,gold,color); else if(df5[xx][yy]!=color&&df5[xx][yy]!=0)dfs(xx,yy,0,gold+1,df5[xx][yy]); } bd[x][y]=false; //回溯 } int main(){ int s1,s2,s3; cin>>n>>k; for(int i=1; i<=k; i++) { cin>>s1>>s2>>s3; df5[s1][s2]=s3+1; } for(int i=0;i<111;i++) for(int j=0;j<111;j++) mingold=2e9;//<===给个大数 dfs(1,1,0,0,df5[1][1]); if(ans==1000000000)cout<<-1; else cout<<ans; } ```
by GoldenFishX @ 2019-11-13 20:47:04


谢谢大佬
by Adis_FireDevil @ 2019-11-14 16:16:31


|