题目的意思是:给你一个迷宫,0代表墙,1代表路,2代表起始位置,3代表终点,4代表爆破装置。一开始,你在2的位置,求到3的最少步数。
起初,你只有6秒钟的时间,时间减到0,你没到3的位置,代表不能出去,输出-1.想要增加时间,可以引爆爆破装置,引爆之后,时间重置为6,可以引爆多个。到引爆装置的时候,时间必须大于0,不然没有时间可以引爆。
迷宫最大是8 * 8。用广度优先搜索可以简单的解决问题。
下面的是AC的代码:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; class Data { public: int Etime; int x, y; int count; }; int n, m, sx, sy; int map[9][9]; int direction[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; int bfs() //广度搜索 { int i; int tx, ty; queue<Data> Que; while(!Que.empty()) { Que.pop(); } Data Da, temp; Da.x = sx; Da.y = sy; Da.Etime = 6; Da.count = 0; Que.push(Da); //起点入队 while(!Que.empty()) { temp = Que.front(); Que.pop(); if(map[temp.x][temp.y] == 3) //到了终点 return temp.count; if(temp.Etime == 1) //没到终点,时间变成1,下一步之后,时间变0,无论怎么走,都没时间了,直接跳过 continue; //忽略掉时间为0的,下面的引爆就不用判断时间 for(i = 0; i < 4; i++) //四个方向搜索 { tx = temp.x + direction[i][0]; ty = temp.y + direction[i][1]; if(tx < 0 || tx >= n || ty < 0 || ty >= m || map[tx][ty] == 0) continue; Da.x = tx; Da.y = ty; Da.Etime = temp.Etime - 1; Da.count = temp.count + 1; if(map[tx][ty] == 4) //引爆,重置时间 { Da.Etime = 6; map[tx][ty] = 0; } Que.push(Da); } } return -1; } int main() { // freopen("data.txt", "r", stdin); int T, i, j; while(scanf("%d", &T) != EOF) { while(T--) { scanf("%d%d", &n, &m); for(i = 0; i < n; i++) for(j = 0; j < m; j++) { scanf("%d", &map[i][j]); if(map[i][j] == 2) //找到起点 { sx = i; sy = j; } } int ans = bfs(); cout << ans << endl; } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-09 01:40:24