hdu_1072_Nightmare(BFS)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1072

题意:给你一个地图,让你在炸弹爆之前找到出口,最初炸弹设定为6,每走一格需要1,中途有地方能让炸弹的时间重置为6,找到出口的最短时间。

题解:直接上BFS,需要注意的是要另开一个数组来存当前位置的炸弹最大时间,如果走回来时炸弹比原来的时间小,就不走。

#include<cstdio>
#include<queue>
using namespace std;
int g[10][10],v[10][10],m,n,sx,sy,dir[][2]={1,0,-1,0,0,1,0,-1};
#define FFC(i,a,b) for(int i=a;i<=b;i++)
bool check(int x,int y){if(g[x][y]==0||x>n||x<1||y>m||y<1)return 0;return 1;}
struct node{int x,y,c,t;};
int fuck(){
	node s,now;s.x=sx,s.y=sy,s.c=0,s.t=6,v[sx][sy]=1;
	queue<node>Q;Q.push(s);
	while(!Q.empty()){
		now=Q.front();Q.pop();
		if(!now.t)continue;
		if(g[now.x][now.y]==3)return now.c;
		if(g[now.x][now.y]==4)now.t=6;
		v[now.x][now.y]=now.t;
		FFC(i,0,3){
			int xx=now.x+dir[i][0],yy=now.y+dir[i][1];
			if(check(xx,yy)&&now.t-1>v[xx][yy]){
				s.x=xx,s.y=yy,s.c=now.c+1,s.t=now.t-1;
				Q.push(s);
			}
		}
	}
	return -1;
}
int main(){
	int t,tmp;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		FFC(i,1,n)FFC(j,1,m){
			scanf("%d",&g[i][j]);
			v[i][j]=0;
			if(g[i][j]==2)sx=i,sy=j;
		}
		printf("%d\n",fuck());
	}
	return 0;
}
时间: 2024-10-17 04:54:30

hdu_1072_Nightmare(BFS)的相关文章

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

BFS+康托展开(洛谷1379 八数码难题)

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据) 输入样例#1: 2831

Sicily 1444: Prime Path(BFS)

题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool isPrime(int n){//素数判断 5 if(n == 2 || n == 3) return true; 6 else{ 7 int k = sqrt(n) + 1; 8 for(int i = 2; i < k; i

HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 524    Accepted Submission(s): 151 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams abou

POJ3967Ideal Path[反向bfs 层次图]

Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colo

胜利大逃亡(续)(状态压缩bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================

图的两种遍历-DFS&amp;BFS

DFS和BFS在图中的应用: 图连通性判定:路径的存在性:图中是否存在环:求图的最小生成树:求图的关键路径:求图的拓扑排序. DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走,直到所有路都走完: struct node { int next; //E[i].next指向图中与i同父的下一个结点 int to; //E[i].to指向图中i的子结点 }E[110]; int N; int fa[110]; //记录各点的父结点 bool vis[110]; //记录这个点

POJ 2251 Dungeon Master (bfs)

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; char mat[50][50][50]; int vis[50][50][50]; int op[6][3]={0,-1,0, 0,1,0, 1,0,0, -1,0,0 ,0,0,1, 0,0,-1 }; int ok; in