迷宫 dfs爆搜
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:
迷宫
(maze.cpp/in/out 1s 256M)
最近,小Y在玩一款迷宫游戏,游戏是在一个n? m的网格上进行的,每个
格子可能是空地或者障碍物。游戏一开始,玩家控制的角色位于图中的某块空地
上。在游戏过程中,玩家可以用上下左右键控制角色向相邻且没有障碍物的格子
移动(当然,角色不能移动到地图之外,也不能对角线移动)。游戏的目标是收
集地图上出现的星星(每个星星只能收集一次),收集的数量越多分数越高。小
Y刚开了一局游戏,假设游戏时间没有限制,他想知道自己最多能收集到多少个
星星。
Input
第一行包含两个正整数n和m,表示游戏的地图包含n行m列。
接下来给出一个n×m的字符矩阵,每个字符可能为以下几种:
● #:表示该位置有障碍物
● . (英文句号):表示该位置是空地
● *:表示该位置是空地,且生成了一颗星星
● S :表示该位置是空地,且玩家初始时位于该位置,保证图中有且只有一个S
1≤n,m≤200。
Output
共一行,包含一个整数,表示最多能收集到多少颗星星
Sample Input
4 8
..#...*.
*.#.S#..
######..
.*..#.*.
Sample Output
2
直接爆搜,两个if分别判断'.'和'*',来进行dfs
code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int dx[5]={1,0,-1,0}; 4 int dy[5]={0,1,0,-1}; 5 bool bb[210][210]; 6 char mpa[210][210]; 7 int n,m,ans=0; 8 void inint(){ 9 freopen("maze.in","r",stdin); 10 freopen("maze.out","w",stdout); 11 } 12 inline int read(){ 13 int x=0,f=1;char ch=getchar(); 14 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 15 while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 16 return x*f; 17 } 18 void dfs(int x,int y) 19 { 20 for(int k=0;k<4;k++) 21 { 22 if(mpa[x+dx[k]][y+dy[k]]=='*'&&bb[x+dx[k]][y+dy[k]]==false){ 23 ans++; 24 bb[dx[k]+x][dy[k]+y]=true; 25 dfs(x+dx[k],y+dy[k]); 26 } 27 if(bb[x+dx[k]][y+dy[k]]==false&&(mpa[x+dx[k]][y+dy[k]]=='.')) 28 { 29 bb[x+dx[k]][y+dy[k]]=true; 30 dfs(x+dx[k],y+dy[k]); 31 } 32 } 33 } 34 int main() 35 { 36 //inint(); 37 n=read(),m=read(); 38 for(int i=1;i<=n;i++) 39 for(int j=1;j<=m;j++) 40 cin>>mpa[i][j]; 41 42 for(int i=1;i<=n;i++) 43 for(int j=1;j<=m;j++) 44 { 45 if(mpa[i][j]=='S') 46 dfs(i,j); 47 } 48 printf("%d\n",ans); 49 return 0; 50 } 51 /* 52 4 8 53 ..#...*. 54 *.#.S#.. 55 ######.. 56 .*..#.*. 57 */