Problem : 1253 ( 胜利大逃亡 ) Judge Status : Accepted
RunId : 5861859 Language : C++ Author : qq1203456195
做这道题经历了一番波折啊~
开始写了一个代码、自己测试了几个小例子、都通过了、可是就是不能AC。
后来经苏哥指点,我学会了一种新的测试方法,经过这种方法的检测,我的代码明显是有错误的、
后来发现我没有考虑环路、导致部分情形程序会一直运行下去、然后我就加上了一些约束、
各种情形都能给出解了、但是有的明显不是最短路径、这是才发现原来我的代码是DFS、
本来应该用队列的、我最初却使用了栈、
今天上午有时间写一些代码了、发现C++中的队列容器不会用、就模仿别人的代码操作、
学到的用法就是下边四个、看C++Primer中对queue的用法也没有举例子、而且只告诉
了几个函数、看过之后只是会用、并不算掌握。
#include<queue>
queue<type> qvar;
qvar.pop();
var=qvar.front();
qvar.push(var);
#include <iostream> #include <queue>
#include <cstdio> using namespace std; #define N 51 class Point{ public: int x,y,z; }; int a,b,c,T; int maze[N][N][N];//迷宫 int dist[N][N][N];//记录000到每个点的距离 int step[6][3]={{1,0,0},{0,1,0},{0,0,1},{0,0,-1},{0,-1,0},{-1,0,0}}; int illegal(Point p) { int flag=0; if (p.x<0||p.x>=a) flag=1; if (p.y<0||p.y>=b) flag=1; if (p.z<0||p.z>=c) flag=1; return flag; } int bfs() { queue<Point> q; int i,flag=1; Point p,nxt; p.x=0; p.y=0; p.z=0; q.push(p);//000入队 while (!q.empty()&&flag) { p=q.front(); q.pop(); for (int i=0;i<6;i++) { nxt.x=p.x+step[i][0]; nxt.y=p.y+step[i][1]; nxt.z=p.z+step[i][2]; if (illegal(nxt)||maze[nxt.x][nxt.y][nxt.z]) continue; if (dist[nxt.x][nxt.y][nxt.z]!=0) continue; q.push(nxt); dist[nxt.x][nxt.y][nxt.z]=dist[p.x][p.y][p.z]+1; if (nxt.x==a-1&&nxt.y==b-1&&nxt.z==c-1) flag=0; } } if (!flag && dist[a-1][b-1][c-1]<=T) return dist[a-1][b-1][c-1]; return -1; } int main() { int cases; // freopen("cases.txt","r",stdin); // freopen("out1.txt","w",stdout); scanf("%d",&cases); while (cases--) { scanf("%d%d%d%d",&a,&b,&c,&T); for (int i=0;i<a;i++) { for (int j=0;j<b;j++) { for (int k=0;k<c;k++) { scanf("%d",&maze[i][j][k]); dist[i][j][k]=0; } } } printf("%d\n",bfs()); } return 0; }