1.利用广搜。看到求最小值就这样做了
2.不能标记已经走过的。原来标记了,但是后来去掉了。可以看到node里面还有布尔值,但是下面没有用
3.但是利用前后两个点的时间剩余比较来代替了。这样在题目给出的第三个测试例子里是可以在走过4之后再
走走过的路,但是一般没有走过4就不行。
4.从文件读入读出也没有办到。一会看看。
5.第一次自己做出来题一次ac。
6.最小时间和剩余步数也是两个不同的问题
2.不能标记已经走过的。原来标记了,但是后来去掉了。可以看到node里面还有布尔值,但是下面没有用
3.但是利用前后两个点的时间剩余比较来代替了。这样在题目给出的第三个测试例子里是可以在走过4之后再
走走过的路,但是一般没有走过4就不行。
4.从文件读入读出也没有办到。一会看看。
5.第一次自己做出来题一次ac。
6.最小时间和剩余步数也是两个不同的问题
#include<iostream>
#include<queue>
#include<fstream>
using namespace std;
//n,m的值不超过8.开到10
const 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]);
}
}
}
}