POJ 1020

ExpandedBlockStart.gif code
 1  #include  < iostream >
 2  using   namespace  std;
 3  int  cake[ 11 ], pos[ 41 ];
 4  int  side, number;
 5 
 6  bool  DFS( int  a)
 7  {
 8       int  min_pos  =   41 ;
 9       int  put;
10 
11       if (a  ==  number)
12      {
13           return   true ;
14      }
15 
16       for ( int  i = 1 ; i <= side; i ++ )
17      {
18           if (pos[i]  <  min_pos)
19          {
20              min_pos  =  pos[i];
21              put  =  i;
22          }
23      }
24       int  j; 
25       for ( int  i = 10 ; i >= 1 ; i -- )
26      {
27           if (cake[i]  &&  min_pos + <=  side  &&  put + i - 1   <=  side)
28          {
29               for (j = put; j <= put + i - 1 ; j ++ )
30              {
31                   if (pos[j]  >  min_pos)
32                  {
33                       break ;
34                  }
35              }
36 
37               if (j > put + i - 1 )
38              {
39                  cake[i] -- ;
40                   for ( int  t = put; t <= put + i - 1 ; t ++ )
41                  {
42                      pos[t]  +=  i;
43                  }
44                   if (DFS(a + 1 ))
45                  {
46                       return   true ;
47                  }
48 
49                  cake[i] ++ ;
50                   for ( int  t = put; t <= put + i - 1 ; t ++ )
51                  {
52                      pos[t]  -=  i;
53                  }
54              }
55          }
56      }
57 
58       return   false ;
59  }
60 
61  int  main()
62  {
63       int  count;
64      cin  >>  count;
65       while (count  >   0 )
66      {
67          count -- ;
68          memset(cake,  0 sizeof (cake));
69          memset(pos,  0 sizeof (pos));
70          cin  >>  side  >>  number;
71           int  sum  =   0 ;
72           int  c;
73           for ( int  i = 0 ; i < number; i ++ )
74          {
75              cin  >>  c;
76              cake[c] ++ ;
77              sum  +=  c  *  c;
78          }
79 
80           if (sum  !=  side  *  side)
81          {
82              cout  <<   " HUTUTU! "   <<  endl;
83          }
84           else  
85          {
86               if (DFS( 0 ))
87              {
88                  cout  <<   " KHOOOOB! "   <<  endl;
89              }
90               else
91              {
92                  cout  <<   " HUTUTU! "   <<  endl;
93              }
94          }
95      }
96 
97 
98       return   0 ;
99  }

 

转载于:https://www.cnblogs.com/zhtf2014/archive/2010/08/22/1805925.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值