洛谷题解 P1506 拯救oibh总部

原题传送门

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;
}
原文地址:https://www.cnblogs.com/-pwl/p/13647096.html