hdu 1072 Nightmare
2013-07-06 16:30
316 查看
一道简单的bfs,练练手,好久没敲bfs的题
题目的意思是有个***,必须在6分钟内逃出迷宫,途中有重置***时间的装置。
题目的意思是有个***,必须在6分钟内逃出迷宫,途中有重置***时间的装置。
#include<iostream> #include<cstdio> #include<queue> using namespace std; int map[10][10],n,m,num; struct Node { int x,y; int BomTime; int time; } start; Node visit[350]; int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}}; int MyFind(Node *p) { int i; for(i=0;i<num;i++) { if(p->x==visit[i].x&&p->y==visit[i].y&&p->BomTime==visit[i].BomTime) return 1; } return 0; } int bfs() { queue<Node> q; Node t,tmp; int i; visit[++num]=start; q.push(start); while(!q.empty()) { t=q.front(); q.pop(); for(i=0;i<4;i++) { tmp=t; tmp.x+=dir[i][0]; tmp.y+=dir[i][1]; if(map[tmp.x][tmp.y]==-1||map[tmp.x][tmp.y]==0) continue; if(map[tmp.x][tmp.y]==4) tmp.BomTime=6; else tmp.BomTime=t.BomTime-1; tmp.time=t.time+1; if(map[tmp.x][tmp.y]==3) { return tmp.time; } else if(tmp.BomTime>=2&&!(tmp.x==start.x&&tmp.y==start.y)&&!MyFind(&tmp)) { q.push(tmp); visit[++num]=tmp; } } } return -1; } int main() { int t,i,j; scanf("%d",&t); while(t--) { num=0; scanf("%d%d",&n,&m); memset(map,-1,sizeof(map)); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { scanf("%d",&map[i][j]); if(map[i][j]==2) { start.x=i; start.y=j; start.BomTime=6; start.time=0; } } printf("%d\n",bfs()); } return 0; }
相关文章推荐
- HDU 1072 Nightmare
- hdu 1072 Nightmare (bfs)
- HDU 1072 Nightmare
- HDU 1072 Nightmare 基础BFS
- HDU 1072 Nightmare
- hdu 1072 Nightmare (广搜)
- HDU - 1072 Nightmare
- HDU-1072-Nightmare
- HDU 1072 Nightmare (bfs)
- hdu1072 Nightmare
- HDU 1072 Nightmare (BFS)
- hdu 1072 Nightmare(DFS)
- Nightmare (HDU 1072)—— BFS
- HDU 1072 Nightmare
- HDU1072-Nightmare【广度优先搜索】
- 【水爆炸BFS】Hdu1072——Nightmare
- hdu 1072 Nightmare(BFS+回头路)
- HDU 1072 Nightmare
- HDU 1072 Nightmare
- hdu 1072 Nightmare (广搜)