Project Euler 265

by uwi
@see http://projecteuler.net/index.php?section=problems&id=265
♥0 | Line 55 | Modified 2009-12-02 03:53:37 | MIT License
play

ActionScript3 source code

/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/a5z4
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=265
    public class Euler265 extends Sprite {
        private var _tf : TextField;
  
        public function Euler265() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            tr(solve(5));
            var g : int = getTimer();
            tr((g - s) + " ms");
        }
        
        private var _used : Array;
        private var _lim : int;
        private var _digit : uint;
        private var _N : int;

        private function solve(N : int) : Number
        {
            _N = N;
            _lim = 1 << N;
            _used = new Array(1 << N);
            for(var i : int = 0;i < _used.length;i++)_used[i] = 0;
            _digit = 0;
            
            _used[0] = 1;
            return dfs(1, 0);
        }
        
        // d : 深さ
        // u : 上位の数(N-1 bit)
        private function dfs(d : int, u : uint) : Number
        {
            if(d == _lim){
                // 最後の0を削る
                return _digit >>> (_N - 1);
            }
            
            var sum : Number = 0;
            for(var i : uint = 0;i <= 1;i++){
                var v : uint = (u << 1) | i;
                if(_used[v] == 0){
                    _used[v] = 1;
                    _digit = (_digit << 1) | i;
                    sum += dfs(d + 1, v & ((_lim - 1) >> 1));
                    _digit >>>= 1;
                    _used[v] = 0;
                }
            }
            return sum;
        }

        private function tr(...o : Array) : void
        {
            _tf.appendText(o + "\n");
            _tf.scrollV = _tf.maxScrollV;
        }
    }
}