A1109. 三角形
时间限制:
1.0s 内存限制:
256.0MB
试题来源
NOIP1997 普及组
问题描述
将1,2,······,9共9个数排成下列形态的三角形。
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
输出所有满足上述条件的三角形的个数以及其中的一种方案。
若有多种方案输出字典序最小的那种。若无解输出NO。
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
输出所有满足上述条件的三角形的个数以及其中的一种方案。
若有多种方案输出字典序最小的那种。若无解输出NO。
输入格式
输入一行一个数表示P。
输出格式
无解输出一行NO,否则第一行是方案数,接下来是字典序最小的方案。每行的数之间用一个空格隔开。具体见样例。
样例输入
23
样例输出
2
7
2 3
6 4
8 1 5 9
7
2 3
6 4
8 1 5 9
数据规模和约定
无。
解析:数据规模比较小,直接搜索或者枚举就可以了。
代码:
#include<cstdio>
bool flag[10];
int p,a[10],b[10],ans=0;
void redirect()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
}
inline bool ok(int step,int x)
{
if(flag[x])return 0;
if(step==2 || step==3 || step==7)return 1;
if(step==4)return x>a[2];
if(step==5)return x>a[3];
if(step==6)return (x>a[1])&&(a[1]+a[2]+a[4]+x==p);
if(step==8)return x>a[7];
if(step==9)return (x>a[6])&&(a[6]+a[7]+a[8]+x==p) && (a[1]+a[3]+a[5]+x==p);
}
void dfs(int step)
{
int i,j,k;
if(step>=9)
{
ans++;
if(ans==1)for(i=1;i<=9;i++)b[i]=a[i];
return;
}
for(i=1;i<=9;i++)
if(ok(step+1,i))flag[i]=1,a[step+1]=i,dfs(step+1),flag[i]=0;
}
void work()
{
scanf("%d",&p);
for(int i=1;i<=9;i++)
flag[i]=1,a[1]=i,dfs(1),flag[i]=0;
if(ans==0)printf("NO\n");
else
{
printf("%d\n%d\n",ans,b[1]);
printf("%d %d\n",b[2],b[3]);
printf("%d %d\n",b[4],b[5]);
printf("%d %d %d %d\n",b[6],b[7],b[8],b[9]);
}
}
int main()
{
//redirect();
work();
return 0;
}