题目:在一个w x h的矩形广场上,每一块1 x 1的地面都铺设了红色或黑色的瓷砖。小林同学站在某一块黑色的瓷砖上,他可以从此处出发,移动到上、下、左、右四个相邻且是黑色的瓷砖上。现在,他想知道,通过重复上述移动能经过的黑色瓷砖数。
数据输入:
第1行为h、w,2<=w、h<=50,之间有一个空格隔开。
以下为1个w行h列的二维字符矩阵,每个字符为“.”“#”“@”,分别表示该位置为黑色的瓷砖、红色的瓷砖、小林的初始位置。
数据输出:
输出一行一个整数,表示小林从初始位置出发可以经过的黑色瓷砖数。
题解:一道"迷宫"题,用深搜,挨个上下左右枚举,如果是黑色瓷砖,dfs。否则不管,在定义一个flag数组,记录走过没有,如果走到一个没被走过的黑色瓷砖,ans++。
#include<cstdio> #include<iostream> using namespace std; char a[60][60]; bool flag[60][60]; int ans=1; void dfs(int x,int y)//深搜函数 { if(a[x+1][y]=='.' && !flag[x+1][y])//判断是否要dfs,下面同理 { flag[x+1][y]=1; ans++;//答案++ dfs(x+1,y); } if(a[x-1][y]=='.' && !flag[x-1][y]) { flag[x-1][y]=1; ans++; dfs(x-1,y); } if(a[x][y+1]=='.' && !flag[x][y+1]) { flag[x][y+1]=1; ans++; dfs(x,y+1); } if(a[x][y-1]=='.' && !flag[x][y-1]) { flag[x][y-1]=1; ans++; dfs(x,y-1); } return; } int main() { int w,h; cin>>h>>w; int x,y; //读入 for(int i=1;i<=w;i++) { for(int j=1;j<=h;j++) { cin>>a[i][j]; if(a[i][j]=='@') { x=i; y=j; } } } dfs(x,y);//深搜 cout<<ans<<endl;//输出 return 0; }