Project Euler 178
@see http://projecteuler.net/index.php?section=problems&id=178
♥0 |
Line 63 |
Modified 2009-08-17 02:12:29 |
MIT License
archived:2017-03-30 04:50:41
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/aQUg
*/
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.getTimer;
// @see http://projecteuler.net/index.php?section=problems&id=178
public class Euler178 extends Sprite {
private var _tf : TextField;
public function Euler178() {
_tf = new TextField();
_tf.width = 465;
_tf.height = 465;
addChild(_tf);
var s : int = getTimer();
t(solve());
var g : int = getTimer();
t((g - s) + " ms");
}
private var _cache : Array;
private function solve() : Number
{
var ret : Number = 0;
_cache = new Array(10 * 41 * 1024);
for(var i : int = 10;i <= 40;i++){
var con : Array = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
for(var j : int = 1;j <= 9;j++){
con[j]++;
ret += rec(1, j, i, con);
con[j]--;
}
}
return ret;
}
private function rec(pos : int, n : int, lim : int, con : Array) : Number
{
var i : int;
if(pos == lim){
for(i = 0;i <= 9;i++){
if(con[i] == 0)return 0;
}
return 1;
}
var c : int = (lim - pos) * 10 + n;
for(i = 0;i <= 9;i++)c = (c << 1) | (con[i] >= 1 ? 1 : 0);
if(_cache[c])return _cache[c];
var ret : Number = 0;
if(n < 9){
con[n + 1]++;
ret += rec(pos + 1, n + 1, lim, con);
con[n + 1]--;
}
if(n > 0){
con[n - 1]++;
ret += rec(pos + 1, n - 1, lim, con);
con[n - 1]--;
}
_cache[c] = ret;
return ret;
}
private function t(o : *) : void
{
_tf.appendText("" + o + "\n");
}
}
}