A1109. 三角形

1.0s   内存限制: 256.0MB  

​443​​   AC次数: 193   平均分: 58.97

将本题分享到:

       

   

​查看未格式化的试题​​​    ​​​提交​​​    ​​​试题讨论​

试题来源

  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。

输入格式

  输入一行一个数表示P。

输出格式

  无解输出一行NO,否则第一行是方案数,接下来是字典序最小的方案。每行的数之间用一个空格隔开。具体见样例。

样例输入

23

样例输出

2
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;
}