CF6A Triangle
题目描述:
给定4根木棍的长度,如果它们中存在3根木棍可以组成三角形,输出 TRIANGLE ;如果它们无法组成三角形,但是它们中存在3根木棍可以组成退化的三角形(三角形面积为0),输出 SEGMENT ;否则,输出 IMPOSSIBLE 。
注意: 木棍不能折断,也不能只用一部分长度。
解题思路:
大体思路就是要判断每种组合符合上述哪一种情况,问题就到了该怎么实现每一种组合。可以使用暴力枚举,我这里使用的递归。
#include <stdio.h>
#define N 4
int star[N];//定义全局变量存储四根木棍的长度
int a[N];//用来暂时存储一种情况
int book[N];//用来标记出现过的数
int flag[3];//用来标记最后的输出单词因该是什么
void dfs(int x) { //此时正在储存第x根木棍的长度
int i;
if (x == N) { //说明前N-1个已经排好了
if (a[0] + a[1] > a[2] && a[0] + a[2] > a[1] && a[2] + a[1] > a[0])
flag[0] = 1;
else if (a[0] + a[1] == a[2] || a[0] + a[2] == a[1] || a[1] + a[2] == a[0])
flag[1] = 2;
else
flag[2] = 3;
return ;//返回上一次的递归
}
for (i = 0; i < N; i++) {
if (book[i] == 0) { //为0则没有使用过
a[x] = star[i]; //第x根木棍长多少
book[i] = 1;//使用过要标记为1
dfs(x + 1);
book[i] = 0;//用完要及时退回,以便下次递归
}
}
return ;//返回上一次的递归
}
int main(void) {
int i;
for (i = 0; i < 4; i++) { //输入四根木棍的长度
scanf("%d", &star[i]);
}
dfs(0);
if (flag[0] == 1 )
printf("TRIANGLE");
else if (flag[1] == 2)
printf("SEGMENT");
else
printf("IMPOSSIBLE");
return 0;
}
补充:模拟函数 dfs() 的流程