ACM_Jack拆炸弹(深搜)

Posted acgoto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
");
24         else printf("No
");
25     }
26     return 0;
27 }

 



以上是关于ACM_Jack拆炸弹(深搜)的主要内容,如果未能解决你的问题,请参考以下文章

拆炸弹!bomb-whu,phase-1

二进制炸弹,汇编代码解读

phase_4拆炸弹

游戏杂谈Steam上好玩的多人合作游戏

Python代码阅读(第25篇):将多行字符串拆分成列表

CSAPP lab2 二进制拆弹 binary bombs phase_5 施工中