【洛谷】P2895 [USACO08FEB]Meteor Shower S

原题链接:

P2895 [USACO08FEB]Meteor Shower S

思维点:

构建陨石落下的时间地图
因为要求最小步数
采用广度搜索,构建队列,放入初始点
出队:记录出队位置和时间
入队:未到达过,未出界,导弹未落下, 进入队列, 步数+1,标记为到达过

ac代码:

#include 
#include 
#include 
using namespace std;
struct Node {
	int x, y;
	int time;//到达该点的最短时间
} node;

int dx[5] = {0, 0, 0, 1, -1};
int dy[5] = {0, 1, -1, 0, 0};

int mapp[305][305];//陨石掉落时间地图。
bool vis[305][305];

int main() {
	int n;
	scanf("%d", &n);
	
	memset(mapp, -1, sizeof(mapp)); //陨石掉落时间地图初始化为-1
	memset(vis, false, sizeof(vis));
	
	for (int i = 1; i <= n; i++) {
		int sx, sy, st;
		scanf("%d %d %d", &sx, &sy, &st);
		for (int j = 0; j < 5; j++) {
			int tempx = sx + dx[j];
			int tempy = sy + dy[j];
			if (tempx >= 0 && tempy >= 0 && (mapp[tempx][tempy] == -1 || st < mapp[tempx][tempy]))
				mapp[tempx][tempy] = st;
		}
	}//构造陨石地图 
	
	queue<Node> q;
	
	q.push((Node) {0, 0, 0});
	vis[0][0] = true;
	
	while (!q.empty()) {
		node = q.front();
		q.pop();
		if (mapp[node.x][node.y] == -1) {
			printf("%d\n", node.time);
			return 0;
		}
		for (int i = 1; i <= 4; i++) {
			int Newx = node.x + dx[i];
			int Newy = node.y + dy[i];
			if (Newx >= 0 && Newy >= 0 && vis[Newx][Newy] == 0 && (node.time + 1 < mapp[Newx][Newy] || mapp[Newx][Newy] == -1)) {
				q.push((Node) {Newx, Newy, Top.time + 1});
				vis[xx][yy] = true;
			}
		}
	}
	
	printf("-1\n");
	return 0;
}

你可能感兴趣的:(#,洛谷,搜索,广度搜索)