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--"宝藏“?的主要内容,如果未能解决你的问题,请参考以下文章