POJ2362 - Square
遅ればせながらid:Ozyさん、
- 作者: Ozy,やねうらお
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2007/08/09
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 306回
- この商品を含むブログ (69件) を見る
ショートコーディングとは関係ないけど、結城浩さんの
- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2007/06/27
- メディア: 単行本
- 購入: 58人 クリック: 1,055回
- この商品を含むブログ (967件) を見る
で、Square。
長さが与えられたn本の棒で正方形を作れるかどうかを判定する問題。
素直に再帰で解いてみました。
m,l,s[30],d[1<<20]; F(n,t,f,i,j){ if(j=n|t) for(d[f]=1;i--;) if(~f&1<<i&&t+s[i]<=l&!d[f|1<<i]&&F(n-1,(t+s[i])%l,f|1<<i,m)) return 1; return !j; } main(i,t){ for(gets(t);~scanf("%d",&m);l/=4,puts(F(m,0,0,m)?"yes":"no")) for(bzero(d,1<<22),l=0,i=m;i--;l+=s[i]) scanf("%d",s+i); }
再帰関数の仮引数が紛らわしいので説明。
n : 処理していない棒の本数
t : 今繋いでいる辺の長さ
f : 使った棒のフラグ
i,j : ループやらなにやら