任意多边形周长的求取

问题提出:

在一个矩形方格中,随机地涂表格,求所涂多边形的周长。


        我们如果去求图中所有黑点所组成的多边形的周长呢?小学我们就学过切割法。对于凸边形来说,其周长可以等价于一个大矩形的周长。如下图所示

====》

即周长为4*5=20

        但对于凹多边形来说,这就不对了,对于这个凹字就可以看出2*(4+5)!=18。那么应该怎么求呢?对于普通程序员来说,最熟悉的是遍历了,但我可以说的是,有更简单的方法。

        我们来分析下,每个小方块矩形有4条边,但相邻的方块会有重复的边。如果我们把重复的边减掉,不就可以得到其周长了吗。先举个例子。对于两个小方块来说,重合的边为2,故其周长为2*4-2=2*(1+2)=6。其实认真想想也很容易想明白的。好了,那我们怎么求重合的边数呢?如果我们把每个小方块黑点当成一个个的点,然后相邻的黑点连成线,那就是我们所说的图了。所重合的边数,就是这个图边数的两倍,即2e(e为此图边的个数)


        根据图论的知识,所有点的度之和为边数的2倍,。设黑点数为n,则周长为。我们来上图中的周长:4*12-(1+3+2+3+4+3+2+2+4+3+2+1)=48-30=18。

        以上方法所计算的结果是包含内点的,如第一幅图中右下角有一个内点,即白点周边全是黑的。如果不想包括内点,那么可以先进行对内点处理,全变成黑点,然后再处理。对于第一幅图,如果计算内点的话,即:4*25-(1+2+3+2+2+1+3+2+2+1+1+1+3+3+1+2+3+2+2+3+2+1+1+2+2)=100-48=52。而根据切割法原理,我们可以得到周长为2*(2+4)+2(3+4)-2+2(3+4)+2(4+2)+2=12+14+14+12=52。

代码为:

int perimeter(int **d,int n)
{
//	Print(d,n);
	int director[4][2]={{1,0},{0,-1},{-1,0},{0,1}};//方位,右-上-左-下
	///预处理/
	//将内点赋1
	bool isOne=true;
	for(int i=1;i<n-1;i++){
		for(int j=1;j<n-1;j++){
			if(d[i][j]==0){
				isOne=true;
				for(int k=0;k<4;k++){
					if(d[i+director[k][0]][j+director[k][1]]!=1){//如果有一个方位不为1,则此点不符合条件
						isOne=false;
						break;
					}
				}
				if(isOne)
					d[i][j]=1;
			}
		}
	}
	int Onecount=0,
		degree=0;
	for(int i=1;i<n-1;i++){
		for(int j=1;j<n-1;j++){
			if(d[i][j]==1){
				Onecount++;//记录值为1的点数
				for(int k=0;k<4;k++){
					if(d[i+director[k][0]][j+director[k][1]]==1)//记录四个方位值为1的点数
						degree++;
				}
			}
		}
	}
	return 4*Onecount-degree;//返回周长
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 就我所知,“c”是一个字母,同时也是拉丁字母表中的第三个字母。在英语中,它的发音类似于/k/。除了作为一个字母之外,“c”还可以代表一些其他的含义。 首先,作为一个罗马数字,“c”表示数目100。这个用法在古罗马时期非常普遍,而今天,我们也可以在一些场合中看到类似的用法,比如罗马数字钟表。 另外,作为化学元素的符号,“c”代表碳元素。碳是一种重要的元素,它存在于地球上的生物体中,包括人类和其他生物。碳在化学和生物学中扮演着重要的角色,是有机化合物的基础,并且参与到许多生命过程中。 此外,作为音乐符号,“c”代表中央音调(C),也是西方音乐中的一个重要音调。中央音调在音乐中具有基础和中性的作用,很多乐曲都是以中央音调为基础进行构建的。 最后,作为计算机科学的概念,“c”代表一种编程语言。C语言是一门广泛使用的编程语言,它具有高效性和灵活性,被广泛用于软件开发和系统设计。 综上所述,“c”在不同领域有不同的含义,可以代表不同的事物,包括字母、罗马数字、化学元素、音乐音调和编程语言等。 ### 回答2: c是英文字母中的第三个字母。在字母表中,c的前面是b,后面是d。c的发音是/k/,类似于中文拼音中的“c”。c是很常用的字母,在很多英文单词中都会出现。例如,cat(猫)、car(汽车)、cool(酷的),等等。在数学中,c也代表了一些常用的符号。比如,c可以代表一个常数,也可以指代一个圆的周长。在化学中,c代表碳(carbon)的化学符号。在计算机科学中,c是一种编程语言的名称。总的来说,c是一个非常常见的字母,有着广泛的用途和意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值