60分,TLE,大佬们救救我,如何剪枝啊(有注释)

P3956 [NOIP2017 普及组] 棋盘

您一个dfs为什么要写bfs? 蒟蒻本题只会bfs ```cpp #include <bits/stdc++.h> #define N 1007 #define INF 0x3f3f3f3f #define white -1 #define yellow 1 #define red 0 using namespace std; const int DX[]={1,0,-1,0},DY[]={0,1,0,-1}; struct node { bool magic; int color; int x; int y; int dis; node(int a,int b,int c,int d,bool pd) { x=a; y=b; color=c; dis=d; magic=pd; } bool operator < (const node &A) const { return dis>A.dis; } }; priority_queue <node> q; int dis[N][N]; int color[N][N]; void bfs() { dis[1][1]=0; q.push(node(1,1,color[1][1],0,0)); while(!q.empty()) { node t=q.top(); q.pop(); for(int i=0;i<4;i++) { int x=t.x+DX[i],y=t.y+DY[i]; if(color[x][y]==t.color) { if(t.dis<dis[x][y]) { q.push(node(x,y,color[x][y],t.dis,0)); dis[x][y]=t.dis; } } else if(color[x][y]==red||color[x][y]==yellow) { if(t.dis+1<dis[x][y]) { q.push(node(x,y,color[x][y],t.dis+1,0)); dis[x][y]=t.dis+1; } } else if(color[x][y]==white&&t.magic==0) { if(t.dis+2<dis[x][y]) { q.push(node(x,y,color[t.x][t.y],t.dis+2,1)); dis[x][y]=t.dis+2; } } } } } int main() { memset(color,white,sizeof(color)); memset(dis,0x3f,sizeof(dis)); int n,m; scanf("%d%d",&n,&m); while(m--) { int x,y,c; scanf("%d%d%d",&x,&y,&c); color[x][y]=c; } bfs(); if(dis[n][n]==INF)puts("-1"); else printf("%d\n",dis[n][n]); return 0; } ```
by Smile_Cindy @ 2019-11-11 21:53:34


@[Alpha](/user/87058) 额,记错了
by GoldenFishX @ 2019-11-13 21:28:34


|