hdoj1072,Nightmare

来源:互联网 发布:ubuntu golang 安装 编辑:程序博客网 时间:2024/06/08 15:22

1.利用广搜。看到求最小值就这样做了
2.不能标记已经走过的。原来标记了,但是后来去掉了。可以看到node里面还有布尔值,但是下面没有用
3.但是利用前后两个点的时间剩余比较来代替了。这样在题目给出的第三个测试例子里是可以在走过4之后再
  走走过的路,但是一般没有走过4就不行。
4.从文件读入读出也没有办到。一会看看。
5.第一次自己做出来题一次ac。
6.最小时间和剩余步数也是两个不同的问题
#include<iostream>#include<queue>#include<fstream>using namespace std;//n,m的值不超过8.开到10const int con1 = 10;int n,m;int nextX[4] = {0,1, 0,-1};int nextY[4] = {1,0,-1,0};struct Node{int x;int y;//这个点的值int v;//剩下的时间int t;bool b;//走得步数int s;};//标志是否找到路径bool flag = false;//储存迷宫的值Node maze[con1][con1];//起始点int sx,sy;//记录最短用时int minTime;//广搜void bfs();int main(){int t;cin >>t;while(t--){cin >> n>>m;for (int i = 0; i < n; i++ ){for (int j = 0; j < m; j++ ){//初始化迷宫的值cin >> maze[i][j].v;maze[i][j].x = i;maze[i][j].y = j;maze[i][j].t = 0;maze[i][j].s = 0;if(maze[i][j].v==2){sx = i;sy = j;maze[i][j].t = 6;}}}//别忘了每次开始之前吧这些值初始化一下,不然就容易错minTime = 0;flag = false;bfs();if(flag)cout << minTime<<endl;else cout << -1<<endl;}return 0;}void bfs(){queue<Node> q;Node node = maze[sx][sy];q.push(node);while(!q.empty()){node = q.front();q.pop();if(node.t <=1)continue;for ( int i = 0; i < 4; i++ ){int nx = node.x+nextX[i];int ny = node.y+nextY[i];if(nx<0||nx>=n||ny>=m||ny<0)continue;//对比现在与下一个的剩余时间决定是否前进if(maze[nx][ny].v!=0&&maze[nx][ny].t<node.t-1){//步数加,时间减maze[nx][ny].s = node.s+1;maze[nx][ny].t = node.t-1; if(maze[nx][ny].v==3){minTime = maze[nx][ny].s;flag = true;return;}else if(maze[nx][ny].v==4){maze[nx][ny].t=6;}q.push(maze[nx][ny]);}}}}


0 0