Project Euler 260
@see http://projecteuler.net/index.php?section=problems&id=260
♥0 |
Line 105 |
Modified 2009-10-19 07:04:47 |
MIT License
archived:2017-03-30 04:47:14
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/m9Zu
*/
package {
import flash.display.Sprite;
import flash.text.TextField;
import com.bit101.components.*;
import flash.events.*;
import flash.utils.getTimer;
// @see http://projecteuler.net/index.php?section=problems&id=260
public class Euler260 extends Sprite {
private var _tf : TextField;
// (x, y, z)の必勝を判定するとき、
// (x-u,y,z), (x,y-u,z), (x,y,z-u),
// (x-u,y-u,z), (x,y-u,z-u), (x-u,y,z-u),
// (x-u,y-u,z-u) (uは任意の自然数)のどれかが必敗になると
// 必勝になってしまうので、この7つのラインそれぞれの上では、
// 必敗はたかだか1つしかない。それを利用する。
//
// コード中のkのループでは、必敗と判定した後はすべて必勝なので
// breakしている
public function Euler260() {
_tf = new TextField();
_tf.width = 465;
_tf.height = 465;
addChild(_tf);
var pb : PushButton = new PushButton(this, 350, 10);
pb.label = "stop";
pb.width = 100;
pb.addEventListener(MouseEvent.CLICK, function(e : MouseEvent) : void
{
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
});
_s = getTimer();
solve(1000);
}
private var _e11 : Object;
private var _e12 : Object;
private var _e13 : Object;
private var _e21 : Object;
private var _e22 : Object;
private var _e23 : Object;
private var _e3 : Object;
private var N : int;
private var _i : int;
private var _s : int;
private var ret : Number;
private function solve(M : int) : void
{
N = M + 1;
_e11 = {};
_e12 = {};
_e13 = {};
_e21 = {};
_e22 = {};
_e23 = {};
_e3 = {};
ret = 0;
_i = 0;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e : Event) : void
{
// for(var i : int = 0;i <= M;i++){
for(var j : int = 0;j < N;j++){
for(var k : int = 0;k < N;k++){
if(!dfs(_i, j, k)){
if(_i <= j && j <= k)ret += _i + j + k;
break;
// tr(i, j, k);
}
}
}
// }
if(_i % 40 == 0){
tr(_i, ret, (getTimer() - _s) + " ms");
}
if(_i == N - 1){
tr("solved!");
tr(ret, (getTimer() - _s) + " ms");
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
_i++;
}
private function dfs(x : int, y : int, z : int) : Boolean
{
var c11 : int = y * N + z;
if(_e11[c11])return true;
var c12 : int = z * N + x;
if(_e12[c12])return true;
var c13 : int = x * N + y;
if(_e13[c13])return true;
var c21 : int = x * (2 * N) + (z - y);
if(_e21[c21])return true;
var c22 : int = y * (2 * N) + (x - z);
if(_e22[c22])return true;
var c23 : int = z * (2 * N) + (y - x);
if(_e23[c23])return true;
var c3 : int = (y - x) * (2 * N) + (z - x);
if(_e3[c3])return true;
_e11[c11] = 1;
_e12[c12] = 1;
_e13[c13] = 1;
_e21[c21] = 1;
_e22[c22] = 1;
_e23[c23] = 1;
_e3[c3] = 1;
return false;
}
private function makeCode(i : int, j : int, k : int) : int
{
var a : Array = [i, j, k];
a.sort();
return (a[0] * N + a[1]) * N + a[2];
}
private function tr(...o : Array) : void
{
_tf.appendText(o + "\n");
}
}
}