原题传送门
0.前言 这几天一直在做简单的DFS呢...
1.算法 深度优先搜索(DFS)
2.思路
拿到题(尤其是看完样例之后),明确了这是一道搜索题。
算法也很简单。就是DFS。
这道题所有的DFS部分,尤其是上下左右遍历的部分,堪称经典
而输入的部分有个小技巧,可以一个个字符进行输入,然后转换到一个int的图里。
3.代码
#include<iostream>
#include<cstdio>
using namespace std;
inline void read(int &x){ //快读
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
x*=f;
}
int x,y;
char a;
int cnt;
int map[501][501]={0}; //把单个的字符存到一个int数组里,进行遍历
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
//遍历的小技巧,dx[]表示行的变更,dy[]表示列的变更
//因为我们是从1开始循环输入,所以第一个0来充数。
//dx 1表示向下一行,dy 1表示向右一列,其余同理
inline void DFS(int p,int q){ //p,q表示当前遍历到的位置
if(p<0||q<0||p>x+1||q>y+1||map[p][q]) return; //前四个是检查是否越界的条件,最后一个因为map[][]==1的时候表示障碍,所以做遇到障碍的处理
map[p][q]=2; //存为2的原因是保证map[][]不为负数和0,干扰判断
for(int i=1;i<=4;i++) DFS(p+dx[i],q+dy[i]); //四个方向分别开始遍历
}
int main(){
read(x);read(y);
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
cin>>a;
if(a=='0') map[i][j]=0; //字符用0,1存到int数组里
else map[i][j]=1;
}
}
DFS(0,0); //从(0,0)开始搜索
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
if(!map[i][j]) cnt++; //因为没有负数,所以非零即正
}
}
printf("%d",cnt);
return 0;
}