题解
2024-03-17 11:15:15
发布于:陕西
39阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
int a[5];
int u[4];
bool f[5],falg;
void dfs(int dep)
{
if(dep==4)//因为dep是在为下一轮做准备,所以dep=3(准备选第3个数)时才选了2个数,所以要dep=4时来判断
{
if(u[1]+u[2]>u[3]&&u[1]+u[3]>u[2]&&u[2]+u[3]>u[1])
{
printf("TRIANGLE");//满足普通三角形,直接输出
exit(0);//意为"正常退出程序",相当于主函数里面的retrun 0,在DFS里面用可以节省搜到答案后回朔的时间
}
if(u[1]+u[2]>=u[3]&&u[1]+u[3]>=u[2]&&u[2]+u[3]>=u[1])falg=true;
/*
这里不能直接输出
因为弱化三角形的优先级小于普通三角形,
所以当木棍同时满足弱化三角形和普通三角形的条件时应该输出最优解普通三角形
但因为用的是DFS,枚举数的顺序只和数据的顺序有关,于是满足弱化三角形时就直接输了,要到确认没有普通三角形时才能输
(第一次竟然在在这里跪了QAQ)
*/
return;
}
for(int i=1;i<=4;i++)
if(f[i]==false)
{
f[i]=true;
u[dep]=a[i];//把当前枚举到的组合临时存储下来
dep++;//为下轮做准备
dfs(dep);//刚学DFS时教练说内循环要写成镜像来回溯,于是我沿用到现在
dep--;//撤销所有操作
u[dep]=0;
f[i]=false;
}
}
int main()
{
scanf("%d%d%d%d",a+1,a+2,a+3,a+4);//把数组当指针用,小绿书介绍过,也可以写scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4])
dfs(1);
if(falg==true)printf("SEGMENT");//然而第2次又跪在打少了一个等号上(我太蒻了)
else printf("IMPOSSIBLE");
return 0;
}
这里空空如也
有帮助,赞一个