poj 3669 Meteor Shower(BFS)
2015-09-17 22:57
274 查看
题意:一个矩阵,流星下落在某个时刻会砸毁某个点及其上下左右四个点,问某人能否不死?
思路:
记录某点最早爆炸时间(因为爆炸之后不能再走那个点),然后bfs,具体看题解。
题解:
思路:
记录某点最早爆炸时间(因为爆炸之后不能再走那个点),然后bfs,具体看题解。
题解:
/* * mai.cpp * * Created on: 2015年9月15日 * Author: chen */ #include<stdio.h> #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<vector> #include<time.h> #include<queue> #include<stack> #include<iterator> #include<math.h> #include<stdlib.h> #include<limits.h> #include<memory.h> //#define ONLINE_JUDGE #define eps 1e-8 #define INF 0x7fffffff #define FOR(i,a) for((i)=0;i<(a);(i)++) //[i,a); #define MEM(a) (memset((a),0,sizeof(a))) #define sfs(a) scanf("%s",a) #define sf(a) scanf("%d",&a) #define sfI(a) scanf("%I64d",&a) #define pf(a) printf("%d\n",a) #define pfI(a) printf("%I64d\n",a) #define pfs(a) printf("%s\n",a) #define sfd(a,b) scanf("%d%d",&a,&b) #define sft(a,b,c)scanf("%d%d%d",&a,&b,&c) #define for1(i,a,b) for(int i=(a);i<b;i++) #define for2(i,a,b) for(int i=(a);i<=b;i++) #define for3(i,a,b)for(int i=(b);i>=a;i--) #define MEM1(a) memset(a,0,sizeof(a)) #define MEM2(a) memset(a,-1,sizeof(a)) #define LL __int64 const double PI = acos(-1.0); template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; } template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; } template<class T> inline T Min(T a, T b) { return a < b ? a : b; } template<class T> inline T Max(T a, T b) { return a > b ? a : b; } using namespace std; template<class T> T Mint(T a, T b, T c) { if (a>b) { if (c>b) return b; return c; } if (c>a) return a; return c; } template<class T> T Maxt(T a, T b, T c) { if (a>b) { if (c>a) return c; return a; } else if (c > b) return c; return b; } #define maxn 500 int M,x,y,t,maxt; int map[maxn][maxn]; bool vis[maxn][maxn]; int dx[]={-1,1,0,0,0};//x方向 int dy[]={0,0,-1,1,0};//y方向 bool judge(int x,int y){//判断条件 if(x<0||x>=M||y<0||y>=M) return false; return true; } struct node{ int x,y,t;//t记录移动次数 }; int bfs(){ MEM1(vis); queue<node>q; node s,e; s.x=s.y=s.t=0;//初始化 q.push(s); while(!q.empty()){ s=q.front(); q.pop(); for1(i,0,4){//遍历上下左右方向 e.x=s.x+dx[i]; e.y=s.y+dy[i]; e.t=s.t+1; if(!judge(e.x,e.y)) continue; if(!vis[e.x][e.y]&&map[e.x][e.y]>e.t){ if(map[e.x][e.y]>maxt)//如果某点爆炸时间大于流星最后下落的时间,则一点不会受伤,直接返回 return e.t; q.push(e); vis[e.x][e.y]=1; } } } return -1; } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif while(~sf(M)){ memset(map,0x7F,sizeof(map));//0x7F是int最大化,而不是0xFF,一开始纠结了好久都没发现错误!!! maxt=0;//记录最后流星下落的时间 for1(i,0,M){ sft(x,y,t); maxt=max(maxt,t); for1(j,0,5){ int tx=x+dx[j]; int ty=y+dy[j]; if(judge(tx,ty)&&map[tx][ty]>t) map[tx][ty]=t;//记录某个点最早的流星下落时间 } } if(map[0][0]==0)//如果只有1个点,一定会被砸死 printf("-1\n"); else pf(bfs()); } return 0; }
相关文章推荐
- request的setCharacterEncoding()无效
- POJ1023 The Fun Number System【进制相关】
- LeetCode Maximal Rectangle
- LeetCode Maximal Rectangle
- OLED颠覆显示行业 未来电视发展明朗化
- Android 自定义View——自定义点击事件
- Qt Quick 图像处理实例之美图秀秀(附源码下载)
- mongodb的安装与启动(centos7)
- AJAX--显示加载中并弹出图层遮挡页面
- log4j学习(一)最简单的例子
- android:music
- SQL Server中扫描(scan)和查找(seek)这两种算法的区别
- 韩顺平 java 第五讲第六讲第七讲 类与对象 成员方法 构造方法
- 图像处理资源
- 冒泡排序
- Java:static静态方法
- ebs中安全性
- 0917Android基础自定义View的点击事件
- 启动界面显示图片
- EF学习和使用(五)Lazy Loading and Eager Loading