社区讨论
RE求调
P2895[USACO08FEB] Meteor Shower S参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjdojsa
- 此快照首次捕获于
- 2025/11/04 00:52 4 个月前
- 此快照最后确认于
- 2025/11/04 00:52 4 个月前
CPP
#include<bits/stdc++.h>
#define maxn 310
using namespace std;
int m,Ans=100000,ans[maxn][maxn],death[maxn][maxn],d[4][2]={{0,1},{1,0},{-1,0},{0,-1}};//ans[i][j]表示第i行第j列格子的最短到达时间
struct coord{
int x,y;
};
queue<coord>Q;
int read() {
int s=0,f=1;
char ch=getchar();
while(!isdigit(ch)) {
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch)) {
s=s*10+ch-'0';
ch=getchar();
}
return f*s;
}
void write(int n) {
if(n<0) putchar('-'),n=-n;
if(n<10) putchar(n+'0');
else write(n/10),putchar(n%10+'0');
}
void MIN(int x,int y,int t) {
//保存当前格子被流星砸中的最小时间
if(x>=0&&y>=0) death[x][y]=min(death[x][y],t);
}
int main() {
m=read();
memset(ans,-1,sizeof(ans));
memset(death,0x7f,sizeof(death));
for(int i=1;i<=m;i++) {
int x,y,t;
x=read();y=read();t=read();
MIN(x,y,t);
for(int k=0;k<4;k++)
MIN(x+d[k][0],y+d[k][1],t);
}
ans[0][0]=0;
Q.push((coord){0,0});
while(!Q.empty()) {
coord u=Q.front();
int ux=u.x,uy=u.y;
Q.pop();
for(int k=0;k<4;k++) {
int x=ux+d[k][0],y=uy+d[k][1];//生成下一层节点
if(x<0||y<0||ans[x][y]!=-1||ans[ux][uy]+1>=death[x][y]) continue;//不合法直接跳过
ans[x][y]=ans[ux][uy]+1;
Q.push((coord){x,y});
}
}
for(int i=0;i<310;i++)
for(int j=0;j<310;j++)
if(death[i][j]>1000&ans[i][j]!=-1)
Ans=min(Ans,ans[i][j]);//找最优解
if(Ans==100000) puts("-1");
else write(Ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...