解析:
這道題目非常容易TLE,所以我們需要三維BFS+剪枝。
代碼:
#include #include #include #include #include #include #include #include #include #include #include using namespace std; #define Lowbit(x) ((x)&(-(x))) #define ll long long #define mp make_pair #define ff first #define ss second #define pb push_back #define mod 10000007 //#define LOCAL #define MAXN 100010 #define INF 1e9 #define Max 100010 typedef struct node{ int x,y,z; int cost; }NODE; bool flag[55][55][55]; //標記是否訪問過 int p[55][55][55]; //記錄地圖 //六個方向 int tx[]={0,0,0,0,1,-1}; int ty[]={0,1,0,-1,0,0}; int tz[]={1,0,-1,0,0,0}; int A,B,C,T; bool check(int x,int y,int z){ if(x<0||x>=A||y<0||y>=B||z<0||z>=C||flag[x][y][z]||p[x][y][z]) return false; return true; } int main(){ int K; scanf(%d, &K); while(K--){ queue que; scanf(%d%d%d%d, &A,&B,&C,&T); memset(flag, false, sizeof(flag)); int i,j,k; for(i=0; iT) break; if(now.x==A-1&&now.y==B-1&&now.z==C-1){ ans = now.cost; break; } NODE tmp; for(i=0; i<6&&flag; ++i){ tmp.x = now.x+tx[i]; tmp.y = now.y+ty[i]; tmp.z = now.z+tz[i]; tmp.cost = now.cost+1; if(check(tmp.x,tmp.y,tmp.z)){ flag[tmp.x][tmp.y][tmp.z] = true; //剪枝,當該點以最快速度都不能在規定時間到達時,去掉 if(tmp.cost+abs(tmp.x-A+1)+abs(tmp.y-B+1)+abs(tmp.z-C+1)>T) continue; que.push(tmp); } } } printf(%d , ans); } return 0; }
3. 按鈕類組件 21)問:在進行Wind
G Selling Land As you ma
Dev-Cpp配置OpenGL圖形庫(成功版本:Dev-Cp
交通問題 如圖的城市交通網,每個路口都有紅綠燈。
引言 由於Windows 操作系統在很大程度上
深度優先遍歷,深度優先二叉樹的深度優先遍歷與廣度優先遍歷 [