Meteor Shower POJ - 3669 广搜
2017-07-21 09:27
225 查看
D - Meteor Shower
POJ - 3669 题意:找到一个不会有流星落下的地方。
思路:先将地图赋初值为-1,输入一个流星的坐标和时间后,就将地图上被流星击中过的地方以及它的四个方向标记为流星落下的时间,如果已经被标记过,并且数值不同,这时应标记为下落时间更小的值。接下来,广搜,找到一个为初值-1的地方即可。
代码:
#include<stdio.h> #include<string.h> #include<queue> using namespace std; int n,Map[310][310],c[5][2]= {0,0,1,0,0,1,-1,0,0,-1}; int lu[330][330],d[4][2]= {1,0,0,1,0,-1,-1,0},q; struct yun { int x,y,s; }; int bfs(int x,int y) { yun st,en; queue<yun>Q; st.x=x; st.y=y; st.s=0; lu[x][y]=1; Q.push(st); while(Q.size()) { st=Q.front(); Q.pop(); if(Map[st.x][st.y] == -1)return st.s;//找到没有被流星击中过的地方返回即可。 for(int i=0; i<4; i++)//四个方向。 { int dx=st.x+d[i][0]; int dy=st.y+d[i][1]; if(dx<0||dy<0||lu[dx][dy])continue; if(Map[dx][dy] == -1)return st.s+1;//找到没有被流星击中过的地方返回即可。 if(st.s+1<Map[dx][dy])//当前所走的步数要小于流星落下的时间。 { en.x=dx; en.y=dy; en.s=st.s+1; lu[dx][dy]=1; Q.push(en); } } } return -1;//找不到返回-1. } int main() { int i,j,x1,y1,z1; scanf("%d",&n); memset(Map,-1,sizeof(Map)); memset(lu,0,sizeof(lu)); for(i=0; i<n; i++) { scanf("%d%d%d",&x1,&y1,&z1); for(j=0; j<5; j++)//五个方向,都定义流星降落的时间。 { int x=c[j][0]+x1; int y=c[j][1]+y1; if(x<0||y<0)continue; if(Map[x][y]!=-1&&Map[x][y]<=z1)continue;//将数值定义成流星落下时更小的时间。 Map[x][y]=z1; } } int p=bfs(0,0); printf("%d\n",p); }
相关文章推荐
- 刷题——Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669-BFS
- Meteor Shower POJ - 3669 广搜
- Meteor Shower POJ - 3669
- POJ-3669 Meteor Shower BFS
- D - Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669
- 刷题——Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669
- AYIT2017暑假集训第二周周三赛 D - Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669
- POJ Meteor Shower(BFS)
- POJ_3669 Meteor Shower(BFS)
- POJ 3669
- Meteor Shower(POJ 3669)
- poj 3669 Meteor Shower bfs水题
- POJ 3669 Meteor Shower
- POJ 3669-Meteor Shower [bfs] 《挑战程序设计竞赛》2.1
- poj 3669 Meteor Shower(bfs)