用C语言编程实现下列算法!谢谢!
发布网友
发布时间:2022-04-26 02:47
我来回答
共1个回答
热心网友
时间:2022-06-20 05:24
NOIP(全国信息学奥林匹克联赛)1997
普及组
二、把1,2,…
9共9个数排成下列形状的三角形:(30%)
a
b
c
d
e
f
g
h
i
其中:a~i分别表示1,2,...9中的一个数字,并要求同时满足下列条件:
(1)
a<f<i
(2)b<d,
g<h,
c<e;
(3)a+b+d+f=
f+g+h+i=
i+e+c+a=
P
程序要求:根据输入的边长之和P,输出所有满足上述条件的三角形的个数及其中的一
种方案。
在算法描述中,如果队循环变量的初值和终值精心设置,是可以体现出变量间规定的一些大小关系的,这样做可以减少IF语句,减少运行时间。
参考代码:
#include<iostream>
using
namespace
std;
int
main()
{
bool
z[10]={};
int
a,b,c,d,e,f,g,h,i,p,s=0,x,y;
cin>>p;
for(a=1;a<8;z[a++]=false)
{
z[a]=true;
y=p-5-a<8?p-a-5:8;
for(f=a+1;f<=y;f++)
{
z[f]=true;
x=p-f-3<9?p-f-3:9;
for(i=f+1;i<=x;i++)
{
z[i]=true;
for(b=1;b<=(p-a-f-1)/2;b++)
{
d=p-a-f-b;
if(z[b]||d>9||z[d])continue;
z[b]=z[d]=true;
for(c=1;c<=(p-i-a-1)/2;c++)
{
e=p-a-c-i;
if(z[c]||e>9||z[e])continue;
z[c]=z[e]=true;
for(g=1;g<=(p-f-i-1)/2;g++)
{
h=p-f-g-i;
if(z[g]||h>9||z[h])continue;
if(s++==0)cout<<a<<endl<<b<<c<<endl<<p-a-f-b<<p-a-c-i<<endl<<f<<g<<p-f-i-g<<i<<endl;
}
z[c]=z[e]=false;
}
z[b]=z[d]=false;
}
z[i]=0;
}
z[f]=0;
}
z[a]=0;
}
cout<<s<<endl;
return
0;
}