• 洛谷P2372 —yyy2015c01挑战算周长题解


    传送门

    题目大意:

    给你一个矩阵和一个点的坐标,让你求出这个点所在的连通块的周长。

    那么周长怎么求呢?

    你不要告诉我连这你都不会

    就是将这个连通块的每一个点上靠边的长度加起来即为周长。

    主要思路: dfs 搜索

    将每一个点的周长都算出来,在搜索连通块时将搜到的点的周长都加起来,输出即可。

    坑点:

    1. 在边上的点也有周长

    2. 搜周长时搜上下左右(4)个方向

    3. 连通块(8)面连通

    4. 走过的点不能重复走

    最后贴上代码:

    #include<iostream>
    using namespace std;
    int n,m;
    bool b[23][23]={0},flag[23][23]={0};//原数组和标记数组(标记是否走过)
    int a[23][23]={0};//边长
    const int x1[10]={-1,-1,-1,0,1,1,1,0},y1[10]={-1,0,1,1,1,0,-1,-1};//偏移量
    int dfs(int x,int y)
    {
    	flag[x][y]=1;//标记已走过
    	int ans=a[x][y];
    	for(int i=0;i<8;i++)
    		if(b[x+x1[i]][y+y1[i]]&&!flag[x+x1[i]][y+y1[i]])ans+=dfs(x+x1[i],y+y1[i]);//边界都是0,不用担心边界问题
    	return ans;
    }
    void ch()
    {
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
    		if(b[i][j])
    		{
    			if(!b[i-1][j])a[i][j]++;
    			if(!b[i][j-1])a[i][j]++;
    			if(!b[i][j+1])a[i][j]++;
    			if(!b[i+1][j])a[i][j]++;
    		}//每个点的靠边长度
    }
    int main()
    {
    	char c;
    	int x,y;
    	cin>>n>>m>>x>>y;
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
    	{
    		cin>>c;
    		if(c=='X')b[i][j]=1;//初始化原数组
    	}
    	ch();
    //	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
    //	{
    //		cout<<a[i][j]<<" ";
    //		if(j==m)cout<<endl;
    //	}用于测试靠边长度
    	cout<<dfs(x,y);
    	return 0;
    }
    

    蟹蟹观看!

    完结撒花(。・∀・)ノ❀❀❀

    我要拿金牌!
  • 相关阅读:
    使用flaskcode创建网页代码编辑器
    jsp资料参考
    商城类需求确认单
    “酒香也怕巷子深” Smartflow-Sharp 工作流
    sql server distribution 库数据文件过大
    大数据平台HADOOP、HIVE、HDSF等介绍和使用看这一篇就够了
    vue 虚拟列表滚动
    关于js逗号运算符与reduce只有1个元素
    css 2行省略 多行省略
    【神经网络搜索】NasBench301 使用代理模型构建Benchmark
  • 原文地址:https://www.cnblogs.com/jerrywang-blogs/p/13523989.html
Copyright © 2020-2023  润新知