hdoj1072,Nightmare

1.利用广搜。看到求最小值就这样做了
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]);
			}
			
		}

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值