• hdu 1312 Red and Black


    题目传送门
    解题思路:运用 (dfs) 求出所有的连通块(此题为模板题)

    #include<bits/stdc++.h>
    using namespace std;
    inline int read()//快读 
    {
    	int x=0,k=1;char c=getchar();
    	while(c<'0' || c>'9'){if(c=='-') k=0;c=getchar();}
    	while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    	return k?x:-x;
    }
    int w,h,sx,sy,ans;
    char ch[30][30];
    int dx[]={0,1,0,-1};
    int dy[]={1,0,-1,0};
    void dfs(int x,int y)//深搜 
    {
    	if(ch[x][y]=='.')//如果当前位置是 . 
    	{
    		ans++;//那么把能经过的黑块数加一 
    		ch[x][y]='#';//然后把这个经过的黑块变为红块 
    	}
    	for(int i=0;i<4;i++)//遍历四个方向 
    	{
    		int nx=x+dx[i];//下一个 x 设为当前 x 加上一个 dx[i],表示向左还是向右还是不动 
    		int ny=y+dy[i];//下一个 y 设为当前 y 加上一个 dy[i],表示向上还是向下还是不动 
    		if(nx>=0 && nx<w && ny>=0 && ny<=h && ch[nx][ny]=='.') dfs(nx,ny);
    		//如果这个 nx 在范围内,并且 ny 也在范围内,并且下一个格是 . 那么就深搜 nx,ny 
    	}
    }
    int main()
    {
    	while(h=read(),w=read())//输入 
    	{
    		if(!w && !h) break;//如果两个数都是 0 就退出 
    		ans=1;//将ans设为 1,因为 @ 也算一个黑格 
    		bool f=0;//判断是否还需判断是否有 @ 
    		for(int i=0;i<w;i++)//循环w行 
    		{
    			scanf("%s",ch[i]);//输入当前行 
    			for(int j=0;!f && j<h;j++)//循环当前行的每一列 
    			{
    				if(ch[i][j]=='@')//如果当前格是 @ 
    				{
    					sx=i;//记录 @ 的横坐标 
    					sy=j;//记录 @ 的纵坐标 
    					f=1;//把 f 设为 1,不在判断是否有 @ 
    					break;
    				}
    			}
    		}
    		dfs(sx,sy);//从起点 @ 开始深搜 
    		printf("%d
    ",ans);//输出 
    	}
    	return 0;
    }
    
  • 相关阅读:
    使用python抓取知乎日报的API数据
    git 使用笔记(三)-分支的使用
    git 使用笔记(二)
    git 使用笔记(一)
    Grunt的配置和使用(一)
    笔记-Node.js中的核心API之HTTP
    笔记-Nodejs中的核心API之Events
    (译)Node.js的 EventEmitter 教程
    高性能网站优化-确保异步加载脚本时保持执行顺序
    linux环境下source vimrc提示错误unexpected token `"autocmd"'
  • 原文地址:https://www.cnblogs.com/ForeverOIer/p/12254082.html
Copyright © 2020-2023  润新知