题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
1 3 3 4 20 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0
11
优先队列搜的话TLE到死。。。。看了下Discuss,大家都说用普通队列就能过,毫不犹豫的试了下,还真过了。。。。
估计是数据的问题吧,数据刚好可以一条线走到底的那种。
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; int a[55][55][55]; int vis[55][55][55]; int A,B,C,T; struct node { int x,y,z,t; /*bool friend operator < (node a,node b) { return a.t>b.t; }*/ }; int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,-1},{0,0,1}}; void bfs(int x,int y,int z) { //priority_queue<node>q; queue<node>q; node st; st.x=x; st.y=y; st.z=z; st.t=0; vis[x][y][z]=1; q.push(st); while(!q.empty()){ st=q.front(); //st=q.top(); q.pop(); if(st.x==A-1&&st.y==B-1&&st.z==C-1&&st.t<=T) { printf("%d\n",st.t); //cout<<st.t<<endl; return ; } if(st.t>=T){ printf("-1\n"); return ; } for(int i=0;i<6;i++){ node nt; nt.x=st.x+dir[i][0]; nt.y=st.y+dir[i][1]; nt.z=st.z+dir[i][2]; nt.t=st.t+1; if(nt.x>=0&&nt.y>=0&&nt.z>=0&&nt.x<A&&nt.y<B&&nt.z<C&&a[nt.x][nt.y][nt.z]==0&&!vis[nt.x][nt.y][nt.z]){ vis[nt.x][nt.y][nt.z]=1; q.push(nt); } } } printf("-1\n"); } int main() { int t; //cin.sync_with_stdio(false); scanf("%d",&t); while(t--){ scanf("%d%d%d%d",&A,&B,&C,&T); memset(vis,0,sizeof(vis)); for(int i=0;i<A;i++) // 层数; for(int j=0;j<B;j++) // 横坐标; for(int z=0;z<C;z++) // 列坐标; scanf("%d",&a[i][j][z]); bfs(0,0,0); //cout<<bfs(0,0,0)<<endl; //printf("%d\n",bfs(0,0,0)); } return 0; }