ACM_Jack拆炸弹(深搜)

Jack拆炸弹

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

在一个由n*n个格子组成的监狱里被恐怖份子安置了一个定时炸弹。其中,连续的“.”表示格子之间可以通行,“#”表示障碍物。每次只能按上下左右4个方向走,有障碍物就不能通过。给出一副监狱的俯视图和炸弹(B)和侦探Jack(P)的位置,问Jack能不能找到炸弹的安置点并及时把它拆除,若可以输出"Yes",否则输出“No”.

Input:

输入包含多组测试数据,每组数据第一行为一整数n(n<=100),接着以方格形式输入n*n个字符。

Output:

对于每组测试数据,输出为一行,若Jack可以找到炸弹输出"Yes",否则输出“No”.

Sample Input:

4
#.P.
.#..
.##.
.B..
8
#.#....P
B#....#.
.#......
#......#
.#....#.
#....###
.##.....
#......#

Sample Output:

Yes
No解题思路:还是简单的深搜,水过!AC代码(7ms):
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int si,sj,n,dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};char msp[105][105];bool flag;
 4 void dfs(int x,int y){
 5     if(x<0||y<0||x>=n||y>=n||msp[x][y]==‘#‘)return;
 6     if(msp[x][y]==‘B‘){flag=true;return;}//找到‘B‘,则直接返回
 7     msp[x][y]=‘#‘;//将走过的点标记为‘#‘,表示不能再走
 8     for(int i=0;i<4;++i){
 9         dfs(x+dir[i][0],y+dir[i][1]);
10         if(flag)return;//如果找到,则直接返回
11     }
12 }
13 int main(){
14     while(~scanf("%d",&n)){
15         for(int i=0;i<n;++i){
16             getchar();//吃掉回车符对字符读取的影响
17             for(int j=0;j<n;++j){
18                 scanf("%c",&msp[i][j]);
19                 if(msp[i][j]==‘P‘){si=i,sj=j;}//标记‘P‘的坐标
20             }
21         }
22         flag=false;dfs(si,sj);
23         if(flag)printf("Yes\n");
24         else printf("No\n");
25     }
26     return 0;
27 }

原文地址:https://www.cnblogs.com/acgoto/p/9276836.html

时间: 2024-10-13 03:41:45

ACM_Jack拆炸弹(深搜)的相关文章

方格取数(多线程dp,深搜)

https://www.luogu.org/problem/P1004 题目描述 设有N×N的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0).此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大. 输入格式 输入的第一行为一个整数N(表示N×N的方格图),接下来的每行有三个整数,前

hdu1455 Sticks 深搜 强剪枝

Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6035    Accepted Submission(s): 1704 Problem Description George took sticks of the same length and cut them randomly until all parts becam

深搜笔记

看搜索已经很久了,对于搜索的思想从原来的死记硬背到现在终于懂了一点其实也蛮不错吧,我自己先总结出来了几条关于在图里面深搜的几条方法,仅供参考: 首先:我们得知道深搜是什么,其次于广搜的区别是什么.然后又哪些模板 举一个深搜例子:red and black:这是初学者最常见到的题.对于这题我们所要考虑的就是一个'.'的个数,这个题先要找到@的位置,这个好办,直接: for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(map[i][j]=='@') }

HDU1342 Lotto 【深搜】

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

HDU5723 Abandoned country 最小生成树+深搜回溯法

Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guarante

CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】

[编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色的. 你需要通过一系列操作使得最终每个点变成黑色.每次操作需要选择一个节点i,i必须是白色的,然后i到根的链上(包括节点i与根)所有与节点i距离小于k[i]的点都会变黑,已经是黑的点保持为黑.问最少使用几次操作能把整棵树变黑. 输入描述: 第一行一个整数n (1 ≤ n ≤ 10^5) 接下来n-1

poj1190 生日蛋糕(深搜+剪枝)

题目链接:poj1190 生日蛋糕 解题思路: 深搜,枚举:每一层可能的高度和半径 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到小试 剪枝: ①已建好的面积已经超过目前求得的最优表面积,或者预见到搭完后面积一定会超过目前最优表面积,则停止搭建(最优性剪枝) ②预见到再往上搭,高度已经无法安排,或者半径无法安排,则停止搭建(可行性剪枝) ③还没搭的那些层的体积,一定会超过还缺的体积,则停止搭建(可行性剪枝) ④还没搭的那些层的

Farm Irrigation_深搜_并查集

Farm Irrigation TimeLimit: 2000/1000 MS (Java/Others)  MemoryLimit: 65536/32768 K (Java/Others) 64-bit integer IO format:%I64d Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of

深搜———ZOJ 1004:anagrams by stack

细节问题各种虐!! 其实就是简单的一个深搜 看成二叉树来理解:每个节点有两个枝:入栈和出栈. 剪枝操作:只有当栈顶元素和当前位置的目标字符相同时才出栈,否则就不出栈 dfs写三个参数:depth搜索深度,npush压栈数,npop出栈数 npush用于记录压栈数:主要判断当前压栈是否合理,以及要压入的元素在原串种的位置 npop用于记录出栈数:判断生成的目标串元素的位置 当npush==npop==目标串时,说明生成了一个可执行的操作串 注意输出操作串的时候一定要用depth参数来控制,因为在多