首页 > 其他分享 >P2895 [USACO08FEB] Meteor Shower S

P2895 [USACO08FEB] Meteor Shower S

时间:2023-10-29 11:23:51浏览次数:42  
标签:map int ans Shower dx dy USACO08FEB P2895 include

P2895 [USACO08FEB] Meteor Shower S

语言问题引发的惨案

题目本身不难,简单的BFS,但是写出来明明思路感觉没有问题,却不是答案错就是爆队列。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

struct Node {
	int x, y;
};

const int N = 305;
int map[N][N];
int ans[N][N];
queue<Node> q;
int m, xi, yi, ti;
int ANS = 0x7fffffff;

int walk[5][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}, {0, 0}};

bool is_dir(int x, int y) {
	return x >= 0 && x <= N && y >= 0 && y <= N;
}

void BFS() {
	q.push({0, 0});
	ans[0][0] = 0;
	while (!q.empty()) {
		Node temp = q.front();
		q.pop();
		int x = temp.x, y = temp.y;
		if (map[x][y] == 0x7f)
		{
			ANS = ans[x][y];
			return;
		}
		for (int i = 0; i < 4; i++) {
			int dx = x + walk[i][0], dy = y + walk[i][1];
			if (is_dir(dx, dy) && ans[dx][dy] == -1 && map[dx][dy] > ans[x][y] + 1) {
				ans[dx][dy] = ans[x][y] + 1;
				q.push({dx, dy});
			}
		}
	}
}

int main() {
	memset(map, 0x7f, sizeof(map));
	memset(ans, -1, sizeof(ans));
	cin >> m;
	for (int i = 1; i <= m; i++) {
		cin >> xi >> yi >> ti;
		for (int i = 0; i < 5; i++) {
			int dx = xi + walk[i][0], dy = yi + walk[i][1];
			if (is_dir(dx, dy)) {
				map[dx][dy] = min(map[dx][dy], ti);
			}
		}
	}
	BFS();
	if (ANS == 0x7fffffff) {
		printf("-1");
	} else {
		printf("%d", ANS);
	}
	return 0;
}

无所谓,时间会给出答案,三天之后终于突发奇想,开始调memset,先是输出了

cout << (map[0][0] == 0x7f)

然后惊奇的发现,byd这个表达式为假。

这才记起来memset这玩意,赋值并不是直接赋值,而是 按字节赋值

所以memset(map, 0x7f, sizeof(map));之后,是按照一个字节\(7f\)来赋值,赋值满int的四个字节。

$7f = 0111 1111$0

\(map_ (i,j) = 0111 1111 0111 1111 0111 1111 0111 = 2139062143\)

所以赋值出来是\(2139062143\)!而我BFS的终止条件判断却仍在用\(0x7f\),导致了爆队列。

语言不扎实,什么都白搭!

AC code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

struct Node {
	int x, y;
};

const int N = 305;
int map[N][N];
int ans[N][N];
queue<Node> q;
int m, xi, yi, ti;
int ANS = 0x7fffffff;

int walk[5][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}, {0, 0}};

bool is_dir(int x, int y) {
	return x >= 0 && x <= N && y >= 0 && y <= N;
}

void BFS() {
	q.push({0, 0});
	ans[0][0] = 0;
	while (!q.empty()) {
		Node temp = q.front();
		q.pop();
		int x = temp.x, y = temp.y;
		if (map[x][y] >= 10000)
		{
			ANS = ans[x][y];
			return;
		}
		for (int i = 0; i < 4; i++) {
			int dx = x + walk[i][0], dy = y + walk[i][1];
			if (is_dir(dx, dy) && ans[dx][dy] == -1 && map[dx][dy] > ans[x][y] + 1) {
				ans[dx][dy] = ans[x][y] + 1;
				q.push({dx, dy});
			}
		}
	}
}

int main() {
	memset(map, 0x7f, sizeof(map));
	memset(ans, -1, sizeof(ans));
	cin >> m;
	for (int i = 1; i <= m; i++) {
		cin >> xi >> yi >> ti;
		for (int i = 0; i < 5; i++) {
			int dx = xi + walk[i][0], dy = yi + walk[i][1];
			if (is_dir(dx, dy)) {
				map[dx][dy] = min(map[dx][dy], ti);
			}
		}
	}
	BFS();
	if (ANS == 0x7fffffff) {
		printf("-1");
	} else {
		printf("%d", ANS);
	}
	return 0;
}

标签:map,int,ans,Shower,dx,dy,USACO08FEB,P2895,include
From: https://www.cnblogs.com/kdlyh/p/17795640.html

相关文章

  • [USACO08FEB]meteor Shower S题解(bfs)
    题目描述贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星摧毁的地方)。如果将牧场放入一个直角坐标系中,贝茜现在的位置是原点,并且,贝茜不能踏上一块被流星砸过的土地。根据预......
  • P2895
    本题用时:01:44:20.算法:BFS期间固然去逛了逛淘宝买了两个东西,但毕竟还是太久了。我因为忘记判断是否出界而浪费了好多时间,后来才半天想起来,这便是用了这么长时间的原因。之后提交代码只有六十多分,剩下的点TLE了,我马上反应过来是没判重,赶紧加了个判重。在这里,我没加判重是失误,但......
  • 洛谷 P2894 [USACO08FEB] Hotel G 题解
    题目链接P2894[USACO08FEB]HotelG-洛谷|计算机科学教育新生态(luogu.com.cn)分析考虑用线段树维护区间信息维护sum(最大连续空房间数)如何合并?sum1为max(sum2,sum3)(1的两个子区间)但我们发现若区间为100001(0表示空房间)sum1=4而max(sum2,sum3)=2所以再维护suml(从左开始的......
  • P2895(未解决)
    这是一道略复杂的常规BFS题,但我想用DFS来解决,结果写出代码却总是主函数异常返回,不知哪里错了,检查半天也没发现,以后再看看吧。Code#include<iostream>#include<cstdio>#include<string>#include<vector>#include<algorithm>#include<cstdlib>#include<cmath>usingnamesp......
  • [刷题笔记] Luogu P2895 Meteor Shower S
    ProblemSolution显然bfs,只不过有了限定条件,有实时的流星雨这里提供两种做法:Solution1这也是我一开始的做法模拟实时流星,由于bfs是按层搜的,是严格按照时间递增搜的,故可以模拟实时放流星。需要注意放流星的时间,如果第\(t\)秒有流星,则该秒不可以走,需要在每一秒前放流星。那......
  • [USACO08FEB]Hotel G
    [USACO08FEB]HotelG线段树二分,最大字段和对于操作二,是很简单的区间赋值对于操作一,长度为\(len\)的,我们要找到最小的的\(x\)满足\([x,x+len-1]\)的房间为空在最大字段和的基础上,我们可以求出最长连续空房间的长度,对于要求长度为\(len\)的房间,可以按顺序判断:若左区......
  • [USACO08FEB]Hotel G 线段树区间合并|维护最长的连续1
    这个还是看代码,比讲的清楚#include<bits/stdc++.h>#definefastioios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)#definels(rt<<1)#definers(rt<<1|1......
  • POJ--3669 Meteor Shower(bfs/稍微变通)
    记录21:372023-2-9http://poj.org/problem?id=reference:《挑战程序设计竞赛(第2版)》第二章练习题索引p135DescriptionBessiehearsthatanextraordinarymeteor......
  • P2894 [USACO08FEB]Hotel G
    \(P2894\)[\(USACO08FEB\)]\(Hotel\)\(G\)一、题目描述参考样例,第一行输入\(n,m\),\(n\)代表有\(n\)个房间,编号为\(1-\simn\),开始都为空房,\(m\)表示以下有\(m\)行操作......
  • P2895 [USACO08FEB]Meteor Shower S
    P2895[USACO08FEB]MeteorShowerS#include<iostream>#include<cstring>#include<queue>usingnamespacestd;constintN=310;intx,y,t;intg[N][N];......