• 洛谷题解 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;
    }
    
  • 相关阅读:
    Spring MVC返回多重的Json数据
    Eclipse Maven项目中修改JDK版本
    Maven的使用笔记
    Windows下Redis主从配置出现Writing to master:Unknow error
    Java开发必会的Linux命令(转)
    使用maven引入slf4j、logback时发生冲突
    使用SSM框架搭建JavaWeb,使用Junit测试时遇到CannotGetJdbcConnetionException
    HTTP基础
    express 热启动 静态文件部署 跨域解决 调试
    github+git提交 基础用法
  • 原文地址:https://www.cnblogs.com/-pwl/p/13647096.html
Copyright © 2020-2023  润新知