星辰.Net技术社区论坛

首页 » .NET » 算法/数据结构 » 要求计算满足给定条件的简单多边形的个数
admin - 2008-7-7 12:34:00
Consider zones zi on a plane which consist of triangles. Zone z1 consists of two right-angled isosceles triangles, forming a square. Zone zn + 1 is produced from zone zn in the following way. For each triangle from the previous zone, construct two isosceles right-angled triangles on each of its two legs as a hypotenuse. Then, remove every triangle that is a part of a zone with lower number. The remaining triangles constitute the zone zn + 1. íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Given an integer number n, find how many simple polygons constitute the zone zn. íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
InputThere is a single integer n (1 ≤ n ≤ 2000) on the first line of the input. íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
OutputOutput a single number — the number of simple polygons zone zn consists of. íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Samples
inputoutput
1 1
2 4
3 8
4 12
Problem Author: Dmitry GozmaníS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Problem Source: Dmitry Gozman Contest 1, Petrozavodsk training camp, January 2007 答案如下:íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1 using System;íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
2 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
3 namespace Skyiv.Ben.TimusíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
4 {íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
5  // http://acm.timus.ru/problem.aspx?space=1&num=1531íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
6  sealed class T1531íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
7   {íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
8    static void Main()íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
9     {íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
10       Console.WriteLine(Zones(int.Parse(Console.ReadLine())));íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
11     }íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
12 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
13    static BigInteger Zones(int n)íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
14     {íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
15      if (n == 1) return 1;íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
16      if (n == 2) return 4;íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
17       BigInteger z = 4, c = 2;íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
18      for (int i = 3; i <= n; i++, z += c) if (i % 2 != 0) c *= 2;íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
19      return z;íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
20     }íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
21   }íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
22 }íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
注意,这个程序使用了 BigInteger 类,请到我的另一篇随笔 Timus 1013. K-based numbers. Version 3 中查看其源代码。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这道题目是说,在平原上有若干三角形组成的区域 Zi。Z1 包含两个等腰直角三角形,组成一个正方形。Zn+1 由 Zn 按以下方法生成:以 Zn 中的三角形的直角边作为新的等腰直角三角形的斜边,然后再移去 Zn 中的三角形,剩下的三角形就组成了 Zn+1。现在要求计算 Zn 中包含多少个简单多边形。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
为了找出其中的规律,我们继续画图,一直画到 n = 8,如右图所示。然后在右图中数出 Zn 来,如下:íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1, 4, 8, 12, 20, 28, 44, 60íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
我们发现,该数列后项减前项为:íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
3, 4, 4, 8, 8, 16, 16íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
除了第一个数 3 以外,其余各数依次为:íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
22, 22, 23, 23, 24, 24íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这样,我们就得到以下递推公式 ( [x] 表示对 x 进行下取整 ):íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
Z1 = 1, Z2 = 4, Zn = Zn-1 + 2[(n+1)/2]  (n > 2)íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
有了递推公式,写出相应的程序就非常容易了。由于 Z2000 ≈ 4.286 x 10301,所以程序中使用 BigInteger 类进行计算。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1
查看完整版本: 要求计算满足给定条件的简单多边形的个数