HDU 2102 A计划 DFS与BFS两种写法

1.题意:一位公主被困在迷宫里,一位勇士前去营救,迷宫为两层,规模为N*M,迷宫入口为(0,0,0),公主的位置用‘P‘标记;迷宫内,‘.‘表示空地,‘*‘表示墙,特殊的,‘#‘表示时空传输机,走到这里就会被传输到另一层的相对位置;在迷宫内没走动一步耗时为1,最终求解是否能在T时刻解救到公主;

2.输入输出:第一行C表示C组数据,每一组内N,M,T给出的迷宫规模与时间,接着给出了双层迷宫的内容;若是能找到公主输出"YES",否则"NO";

3.分析:这里原题意判断是否能在T时刻找到,然而要是写搜索判断有没有"时刻为T且位置为P"的状态,会超时,所以直接判断能不能在T时刻之前就找到;

BFS版:求出到达P处的最短时间并判断是否小于T;DFS版:找到第一个"时刻小于T且位置为P的状态"就返回;

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <queue>
 4 # include <cstring>
 5 using namespace std;
 6 const int maxn=15;
 7 int N,M,T;
 8 int dx[4]={0,0,-1,1};
 9 int dy[4]={-1,1,0,0};
10 char maze[2][maxn][maxn];
11 int vis[2][maxn][maxn];
12 struct Node
13 {
14     int l,x,y,t;
15     Node(){}
16     Node(int ll,int xx,int yy,int tt)
17     {
18         l=ll;
19         x=xx;
20         y=yy;
21         t=tt;
22     }
23 };
24 void Init()
25 {
26     scanf("%d%d%d",&N,&M,&T);
27     for(int i=0;i<2;i++)
28         for(int j=0;j<N;j++)
29             scanf("%s",maze[i][j]);
30     memset(vis,0,sizeof(vis));
31 }
32 void Solve()
33 {
34     int ans=-1;
35     queue<Node> Q;
36     vis[0][0][0]=1;
37     Q.push(Node(0,0,0,0));
38     while(!Q.empty())
39     {
40         Node temp=Q.front();
41         Q.pop();
42         if(temp.t<=T&&maze[temp.l][temp.x][temp.y]==‘P‘)
43         {
44             ans=1;
45             break;
46         }
47         if(temp.t>T) break;
48         for(int i=0;i<4;i++)
49         {
50             int nx=temp.x+dx[i];
51             int ny=temp.y+dy[i];
52             if(nx>=0&&ny>=0&&nx<N&&ny<M&&maze[temp.l][nx][ny]!=‘*‘&&!vis[temp.l][nx][ny])
53             {
54                 if(maze[temp.l][nx][ny]!=‘#‘)//"."
55                 {
56                     vis[temp.l][nx][ny]=1;
57                     Q.push(Node(temp.l,nx,ny,temp.t+1));
58                 }
59                 else//‘#‘
60                 {
61                     vis[temp.l][nx][ny]=vis[!temp.l][nx][ny]=1;
62                     if(maze[!temp.l][nx][ny]!=‘*‘&&maze[!temp.l][nx][ny]!=‘#‘)
63                         Q.push(Node(!temp.l,nx,ny,temp.t+1));
64                 }
65             }
66         }
67     }
68     if(ans>0) printf("YES\n");
69     else printf("NO\n");
70 }
71 int main()
72 {
73     //freopen("in.txt","r",stdin);
74     //freopen("out.txt","w",stdout);
75     int C;
76     scanf("%d",&C);
77     while(C--)
78     {
79         Init();
80         Solve();
81     }
82     return 0;
83 }
 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <cstdlib>
 5 using namespace std;
 6 const int MAXN=15;
 7 char Maze[2][MAXN][MAXN];
 8 int dx[4]={1,-1,0,0};
 9 int dy[4]={0,0,1,-1};
10 int vis[2][MAXN][MAXN];
11 int N,M,T,f;
12 void Init()
13 {
14     f=0;
15     scanf("%d%d%d",&N,&M,&T);
16     for(int k=0;k<2;k++)
17         for(int i=0;i<N;i++)
18             scanf("%s",Maze[k][i]);
19     memset(vis,0,sizeof(vis));
20 }
21 void dfs(int k,int x,int y,int t)
22 {
23     if(f) return;
24     if(t<T&&Maze[k][x][y]==‘P‘)
25     {
26         f=1;
27         return;
28     }
29     if(t==T)
30     {
31         if(Maze[k][x][y]==‘P‘)
32             f=1;
33         return;
34     }
35     for(int i=0;i<4;i++)
36     {
37         int nx=x+dx[i];
38         int ny=y+dy[i];
39         if(nx>=0&&ny>=0&&nx<N&&ny<M&&Maze[k][nx][ny]!=‘*‘)
40         {
41             if(Maze[k][nx][ny]!=‘#‘&&!vis[k][nx][ny])
42             {
43                 vis[k][nx][ny]=1;
44                 dfs(k,nx,ny,t+1);
45                 vis[k][nx][ny]=0;
46             }
47             else
48             {
49                 if(Maze[!k][nx][ny]!=‘#‘&&Maze[!k][nx][ny]!=‘*‘)
50                     if(!vis[k][nx][ny]&&!vis[!k][nx][ny])
51                     {
52                         vis[!k][nx][ny]=vis[k][nx][ny]=1;
53                         dfs(!k,nx,ny,t+1);
54                         vis[!k][nx][ny]=vis[k][nx][ny]=0;
55                     }
56             }
57         }
58     }
59 }
60 void Solve()
61 {
62     dfs(0,0,0,0);
63     if(f) printf("YES\n");
64     else printf("NO\n");
65 }
66 int main()
67 {
68     //freopen("in.txt","r",stdin);
69     //freopen("out.txt","w",stdout);
70     int C;
71     scanf("%d",&C);
72     while(C--)
73     {
74         Init();
75         Solve();
76     }
77     return 0;
78 }
时间: 2024-12-20 12:54:24

HDU 2102 A计划 DFS与BFS两种写法的相关文章

hdu 2102 A计划(双层BFS)(详解)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她

hdu 2102 A计划(双层BFS)(具体解释)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,由于他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来解救公主.只是公主早已习以为常,她

hdu 2102 A计划 (bfs+队列)

A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9360    Accepted Submission(s): 2265 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.

HDU 2102 A计划 双层BFS

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出. 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位

HDU 2102 A计划 (深搜)

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出. 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位

for循环的两种写法

教程 (https://tour.golang.org/methods/21) 里的 for 是这样写的: 其中 for 语句可以改写如下: for n, err := r.Read(b); err != io.EOF; n, err = r.Read(b) { fmt.Printf("n = %v err = %v b = %v\n", n, err, b) fmt.Printf("b[:n] = %q\n", b[:n]) } (当然,golang 里的 for

sql sever 的两种写法

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性. 在sql server+ .net 开发环境下,有两种方法能够完成事务的操作,保持数据库的数据完整性: 一个就是用sql存储过程,另一个就是在ADO.NET中一种简单的事务处理: 现在通过一个典型的银行转账的例子来说明一下这两个例子的用法 我们先来看看sql存储过程是如何来

angularJs中$q的两种写法

带缓存处理的两种写法 过程:点击button触发load()方法,请求数据成后显示到页面中.如果已经请求过则从缓存中读取. 在线浏览 写法1: function demo(){ if (demo.cache == undefined) { return $http.get('https://api.github.com/users/github') .success(function(data, status, headers){ demo.cache = data; return $q(fun

描述性编程的两种写法

对象库编程(ORP)是一个非常强大的功能,如果对象名字改变了,只需要进入对象库修改对象,脚本即可批量更新. 描述性编程(DP)不需要维护庞大的对象库,而需要维护庞大的代码,但是在某些情况下(比如对象不能添加到对象库)它很有用. 下面通过一个例子来学习如何进行描述性编程: 首先,我们录制一段在百度首页输入“abcde”,然后点击“百度一下”的代码: Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd"