noip1997 三角形 (搜索,枚举)

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   (2)b   (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
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;
}



你可能感兴趣的:(noip1997 三角形 (搜索,枚举))