如图,从9个单位小方格组成的3x3方格表的16个顶点中任取三个顶点,则这三个顶点组成的直角三角形有几个
![00975ff01a25ce1bf5ed5ad8e1bb33bf.png](https://i-blog.csdnimg.cn/blog_migrate/8853721537c44da1608e71992d9181b0.jpeg)
考虑此问题,我们用C语言暴力解决。用C语言解决该问题要与数学知识结合起来。
穷举思路,如图,以A点为起始点,B点为第二个点,C作为第三个点起始点开始循环,一直到P点结束。然后,第二个点往后移,第三个点起始点变为D点,重复循环。当第二个点在O处时,下一轮第一个点该往后移,所以要设置三层循环。
![d1245dbe1bf0149058ad6ed88b15c47f.png](https://i-blog.csdnimg.cn/blog_migrate/0cbd2dcb8ac074ac7286674eced3cf2f.jpeg)
宏定义
#define SIZE 4//点的总数
#define SIZEX 2//横向点的个数
循环
for (i = 0; i < SIZE; i++) {
for (j = i + 1; j < SIZE; j++) {
for (k = j + 1; k < SIZE; k++) {
if (triangles(i, j, k) == 1 || sjx(i, j, k) == 2) {
num++;
}
if (triangles(i, j, k) == 2) {
num1++;
}
}
}
}
triangles函数部分
int triangles(int i, int j, int k)
{
int ax, bx, cx, ay, by, cy;
int a1, a2, a3, b1, b2, b3;
int m1, m2, m3;
double k1, k2, k3;
ax = (i + SIZEX) % SIZEX;//横坐标
bx = (j + SIZEX) % SIZEX;
cx = (k + SIZEX) % SIZEX;
ay = i / SIZEX;
by = j / SIZEX;
cy = k / SIZEX;
a1 = ax - bx;
b1 = ay - by;
a2 = ax - cx;
b2 = ay - cy;
a3 = bx - cx;
b3 = by - cy;
if (a1 * b2 - a2 * b1 == 0 || a1 * b3 - a3 * b1 == 0 || a3 * b2 - a2 * b3 == 0) return 0;
else if (a1 * a2 - b1 * b2 == 0 || a1 * a3 - b1 * b3 == 0 || a2 * a3 - b2 * b3 == 0) return 2;
else return 1;
}
重点在于函数部分,观察规律可得各个点的横坐标满足(i + SIZEX)% SIZEX,纵坐标满足i / SIZEX,有了坐标,就可以判断三个点围成的形状。
我一开始想用斜率的方法来判断平行和直角,但是发现斜率有不存在的情况,所以就用了向量的方法判断。
a1 * b2 - a2 * b1 ==0|| a1 * b3 - a3 * b1 ==0|| a3 * b2 - a2 * b3 ==0判断的是三个点是否成三角形,原理是向量的平行定理。
a1 * a2 - b1 * b2 ==0|| a1 * a3 - b1 * b3 ==0|| a2 * a3 - b2 * b3 ==0向量相乘为0表示垂直
运行结果
![93bbb3a6a7887ca28032c8f86ba2dcd5.png](https://i-blog.csdnimg.cn/blog_migrate/2b75acca25dec9c9278400f2bbadd6da.jpeg)
其中172为直角三角形的个数,516为三角形的总数。
用数学方法验证是否正确。因为矩形可以分割为四个不同的三角形,所以,计算矩形个数再乘四就为直角三角形个数。
![9ad0e98bcf8a65e4bcb3f78a4da15fc0.png](https://i-blog.csdnimg.cn/blog_migrate/6a72a2f8a115586faa7c46858c9b106d.jpeg)
有9个
![066e9bb4ec5735f18135af3176dea12e.png](https://i-blog.csdnimg.cn/blog_migrate/c83c9c2832c442db713d2881e4c17470.jpeg)
有6个
![a34c61d2dd217df91dcb1e094198dd66.png](https://i-blog.csdnimg.cn/blog_migrate/1fe65794133248293a92f43d6d866ad8.jpeg)
有6个
![dce6f4bbc328c599ca5c4aafe60592ee.png](https://i-blog.csdnimg.cn/blog_migrate/adbdbae7a39fa1994176b36ac67c2b65.jpeg)
有三个
![26cdef3ac4a02cea62ad1eb70b118c2a.png](https://i-blog.csdnimg.cn/blog_migrate/ec5d5191cfa113c37ed5e2e06157077f.jpeg)
有三个
![2240ccc61136055f360a0a7e935c7d09.png](https://i-blog.csdnimg.cn/blog_migrate/ff36c783346b66532386b9a1cf7f30d8.jpeg)
有四个
![579a32ebf742bf9fe8fd6ae683bbfc1b.png](https://i-blog.csdnimg.cn/blog_migrate/77cd417151249cc86272a9ac8b85bee9.jpeg)
有一个
![09bac23f55069553c462efc0a68d7a0c.png](https://i-blog.csdnimg.cn/blog_migrate/156a15da85cea602f5dfa15e6e9a74d2.jpeg)
有四个
![33c8235d93457d23c75a3ff537922694.png](https://i-blog.csdnimg.cn/blog_migrate/d8ac7f26f476a1b0a016386ce559bf20.jpeg)
有两个
![671170f28474024337216897dd788d87.png](https://i-blog.csdnimg.cn/blog_migrate/a2dddcfbc8fa113ae4d9a2cde337fec8.jpeg)
有一个
![b849af94942dddb46b5a244d19509e36.png](https://i-blog.csdnimg.cn/blog_migrate/c5f87b26c5d179a0775e21828e450a52.jpeg)
有2个
![329ef042c39ec95f74127b91e4831a08.png](https://i-blog.csdnimg.cn/blog_migrate/d73a06eade4ecb7cd83a81dc9a57a4bf.jpeg)
有两个
总共有43个矩形,所以直角三角形为172个,与计算机得出结果相同。
此外可以改变SIZE和SIZEX的值来求其他情况三角形的个数。