dfs--"宝藏“?

Posted very-beginning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfs--"宝藏“?相关的知识,希望对你有一定的参考价值。

蒟蒻梦见一片充满宝藏的沙滩, 它是由若干正方形的块状土地组成的一个W*H矩形区域. 蒟蒻决定挖出这片沙滩所有的宝藏,成为传说中的宝藏男孩. 不幸的是,在他挖第二块地时就触发了埋藏其中的地雷,直接炸醒. 他恍然大悟,原来这片沙滩上的每一块地,除了宝藏,还有可能是地雷!

故事没有就这样结束. 第二天,他又做了相同的梦...



编写一个程序,计算出蒟蒻在被炸醒前可能挖到宝藏的最大数量.

Input输入包含多组数据. 每组数据包含两个正整数W和H.

H表示列数,W表示行数. W和H不超过20.


每块地用字符表示如下:

‘.‘ - 宝藏
‘#‘ - 地雷
‘@‘ - 起点(每组数据中只有一个,下面也有宝藏!)
Output对于每组数据,输出一个整数,即蒟蒻能挖到宝藏的最大数量。

 

每次判断是否下一步是宝藏,因为起点也有宝藏,ans初始化为1,ans不断累加。

用dir1和dir2遍历四个方向。flag判断是否还能再走,如果全都不能走,就返回。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int w,h;
 6 int dir1[4]={0,0,1,-1};
 7 int dir2[4]={1,-1,0,0};
 8 char map[50][50];
 9 bool vis[50][50];
10 int ans ;
11 bool flag =true;
12 void dfs(int x,int y)
13 {
14     if (!flag)
15     {
16         return;
17     }
18     for (int i = 0;i <= 3;i++)
19     {
20         flag = false;
21         if ((map[x+dir1[i]][y+dir2[i]]==.)&&(vis[x+dir1[i]][y+dir2[i]]==0)&&(x+dir1[i]>=1)&&(x+dir1[i]<=h)&&(y+dir2[i]>=1)&&(y+dir2[i]<=w))
22         {
23             flag = true;
24             vis[x+dir1[i]][y+dir2[i]]=1;
25             ans++;
26             dfs(x+dir1[i],y+dir2[i]);
27         }
28     }
29 }
30 int main()
31 {
32     int st,ed;
33     while (scanf("%d%d",&w,&h)&&(w+h)!=0)
34     {
35         ans = 1;
36         flag = true;
37     for (int i = 1;i <= h;i++)
38     {
39         for (int j = 1;j <= w;j++)
40         {
41         scanf (" %c",&map[i][j]);
42         vis[i][j]=0;
43         if (map[i][j]==@)
44         {
45             st=i;
46             ed=j;
47             vis[i][j]=1;
48     }
49 }
50 }
51     dfs(st,ed);
52     printf ("%d
",ans);
53 }
54     return 0;
55  } 

 

以上是关于dfs--"宝藏“?的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1044 bfs+dfs

UVALive - 6455 Stealing Harry Potter's Precious (bfs+dfs)

题解 P3959 宝藏

P3959 宝藏 状压dp

题解 P2403 [SDOI2010]所驼门王的宝藏

nyoj 1237 简单dfs