poj 3669 Meteor Shower bfs水题

来源:互联网 发布:数据分析入门 python 编辑:程序博客网 时间:2024/06/18 00:48
// poj 3669 bfs水题// 预处理出每个坐标摧毁的时间,一遍bfs就可以了//// 数组开始只开了325,一直tle。。然后看了discuss开了400 ac了。。。//// 数组一定尽量开大点。。。哎,继续练吧。。。。#include <algorithm>#include <bitset>#include <cassert>#include <cctype>#include <cfloat>#include <climits>#include <cmath>#include <complex>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <deque>#include <functional>#include <iostream>#include <list>#include <map>#include <numeric>#include <queue>#include <set>#include <stack>#include <vector>#define ceil(a,b) (((a)+(b)-1)/(b))#define endl '\n'#define gcd __gcd#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))#define popCount __builtin_popcountlltypedef long long ll;using namespace std;const int MOD = 1000000007;const long double PI = acos(-1.L);template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; }template<class T> inline T lowBit(const T& x) { return x&-x; }template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; }template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; }const int maxn = 400;const int inf = 0x3f3f3f3f;int g[maxn][maxn];struct node {int x;int y;int t;node(int xx,int yy,int tt){x = xx;y = yy;t = tt;}};int m;int vis[maxn][maxn];const int dx[4] = {-1,0,1,0};const int dy[4] = {0,1,0,-1};void print(){for (int i=0;i<6;i++){for (int j=0;j<6;j++){printf("%d ",vis[i][j]);}puts("");}}void init(){memset(g,inf,sizeof(g));memset(vis,0,sizeof(vis));int x,y,t;for (int i=0;i<m;i++){scanf("%d%d%d",&x,&y,&t);g[x][y] = min(g[x][y],t);for (int j=0;j<4;j++){int tx = x + dx[j];int ty = y + dy[j];if (tx<0||ty<0)continue;g[tx][ty] = min(g[tx][ty],t);}}}int bfs(){queue<node> que;while(!que.empty())que.pop();que.push(node(0,0,0));vis[0][0] = true;//int cnt = 0;while(!que.empty()){node x = que.front();que.pop();//vis[x.x][x.y] = true;if (g[x.x][x.y] == inf){return x.t;}//cnt++;for (int i=0;i<4;i++){int tx = x.x + dx[i];int ty = x.y + dy[i];if (tx<0||ty<0)continue;if (vis[tx][ty])continue;if (g[tx][ty]>x.t+1){que.push(node(tx,ty,x.t+1));vis[tx][ty] = 1;}}}return -1;}void solve(){int flag = bfs();//print();printf("%d\n",flag);}int main() {//freopen("G:\\Code\\1.txt","r",stdin);while(scanf("%d",&m)!=EOF){init();solve();}return 0;}

0 0
原创粉丝点击