/**
* Copyright WinField95 ( http://wonderfl.net/user/WinField95 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/zefl
*/
package
{
import adobe.utils.CustomActions;
import flash.display.Sprite
import flash.events.Event;
import flash.text.*;
import flash.display.SimpleButton;
import flash.events.MouseEvent;
import flash.utils.getTimer;
public class Main extends Sprite
{
var display:Display;
//var button1:SimpleButton;
//var button2:SimpleButton;
var arr:Array;
var matrix:Array;
var stack:Array;
var endflag:Boolean;
public function Main():void
{
/*
var back:Sprite = new Sprite();
back.graphics.beginFill(0x000000);
back.graphics.drawRect(0, 0, 800, 800);
back.graphics.endFill();
addChild(back);
*/
var x0:int , y0:int ,diffx:int , diffy:int;
x0 = 280;
y0 = 50;
diffx = 140;
diffy = 100;
arr = new Array();
/*
arr.push(new Node(x0 + 0, y0 + 0, 0));
arr.push(new Node(x0 + 0, y0 + 200, 1));
arr.push(new Node(x0 + 200, y0 + 0 , 2));
arr.push(new Node(x0 + 100, y0 + 200,3))
*/
/*
for (var i:int = 0 ; i < 3 ; i++){
arr.push(new Node(arr[i].getX() - diffx , arr[i].getY() + diffy, i*2));
arr.push(new Node(arr[i].getX() + diffx , arr[i].getY() + diffy, i * 2 + 1));
}
*/
arr.push(new Node(x0, y0, 0));
arr.push(new Node(arr[0].getX() - diffx , arr[0].getY() + diffy, 1));
arr.push(new Node(arr[0].getX() + diffx , arr[0].getY() + diffy, 2))
arr.push(new Node(arr[1].getX() - diffx*0.5 , arr[1].getY() + diffy, 3));
arr.push(new Node(arr[1].getX() + diffx*0.5 , arr[1].getY() + diffy, 4));
arr.push(new Node(arr[2].getX() - diffx*0.5 , arr[2].getY() + diffy, 5));
arr.push(new Node(arr[2].getX() + diffx * 0.5 , arr[2].getY() + diffy, 6));
arr.push(new Node(arr[3].getX() - diffx * 0.3 , arr[3].getY() + diffy, 7));
arr.push(new Node(arr[3].getX() + diffx * 0.3 , arr[3].getY() + diffy, 8));
arr.push(new Node(arr[4].getX() - diffx * 0.3 , arr[4].getY() + diffy, 9));
arr.push(new Node(arr[4].getX() + diffx * 0.3 , arr[4].getY() + diffy, 10));
arr.push(new Node(arr[5].getX() - diffx * 0.3 , arr[5].getY() + diffy, 11));
arr.push(new Node(arr[5].getX() + diffx * 0.3 , arr[5].getY() + diffy, 12));
arr.push(new Node(arr[6].getX() - diffx * 0.3 , arr[6].getY() + diffy, 13));
arr.push(new Node(arr[6].getX() + diffx * 0.3 , arr[6].getY() + diffy, 14));
graphics.lineStyle(4.0);
matrix = new Array();
/*
var m0:Array = [0, 0, 1, 0];
var m1:Array = [0, 0, 2, 0];
var m2:Array = [1, 2, 0, 3];
var m3:Array = [0, 0, 3, 0];
*/
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
var m0:Array = [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var m1:Array = [1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var m2:Array = [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0];
var m3:Array = [0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0];
var m4:Array = [0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0];
var m5:Array = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0];
var m6:Array = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1];
var m7:Array = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var m8:Array = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var m9:Array = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var m10:Array = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var m11:Array = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var m12:Array = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var m13:Array = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0];
var m14:Array = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0];
matrix.push(m0);
matrix.push(m1);
matrix.push(m2);
matrix.push(m3);
matrix.push(m4);
matrix.push(m5);
matrix.push(m6);
matrix.push(m7);
matrix.push(m8);
matrix.push(m9);
matrix.push(m10);
matrix.push(m11);
matrix.push(m12);
matrix.push(m13);
matrix.push(m14);
// 隣接行列の情報とノードに関する情報をコンストラクタの引数として持つ。
display = new Display(matrix,arr);
display.Draw();
addChild(display);
stack = new Array();
stack.push(new Pair(0, 0));
endflag = false;
addEventListener(Event.ENTER_FRAME,onEnterFrame);
/*
button1 = new Button('START',130)
button1.x = 0;
button1.y = 200;
button1.addEventListener(MouseEvent.CLICK,
button1_onMouseClick);
button2 = new Button('END',130)
button2.x = 0;
button2.y = 200;
button2.addEventListener(MouseEvent.CLICK,
button2_onMouseClick);
*/
//addChild(button1);
}
/*
public function button1_onMouseClick(event:MouseEvent):void
{
addChild(display);
removeChild(button1);
addChild(button2);
}
public function button2_onMouseClick(event:MouseEvent):void
{
removeChild(display);
removeChild(button2);
addChild(button1);
}
*/
public function onEnterFrame(event:Event) {
if (endflag) return;
var p:Pair = stack.pop();
var now:int = p.first;
var ind:int = p.second;
if(arr[now].state == Singleton.NOTVISITED)arr[now].state = Singleton.VISITED1;
else arr[now].state = Singleton.VISITED2
display.Draw();
var start:int = getTimer();
while (getTimer() - start < 300);
for ( ; ind < matrix[now].length ; ind++) {
if (matrix[now][ind] == 1 && arr[ind].state == Singleton.NOTVISITED) {
stack.push(new Pair(now,ind+1));
stack.push(new Pair(ind, 0));
return;
}
}
if (now == 0) endflag = true;
arr[now].state = Singleton.FINISH;
display.Draw();
//var start:int = getTimer();
//while (getTimer() - start < 300);
}
/*
public function dfs(now:int) {
var start:uint;
arr[now].state = Singleton.VISITED;
display.Draw();
for (var i:int = 0 ; i < matrix[now].length ; i++) {
if (matrix[now][i] == 1 && arr[i].state == Singleton.NOTVISITED) dfs(i);
}
arr[now].state = Singleton.FINISH;
display.Draw();
}
*/
}
}
class Pair {
public var first:int, second:int;
public function Pair(_first:int,_second:int):void{
first = _first;
second = _second;
}
}
import flash.display.*;
import flash.text.*;
class Button extends SimpleButton // ボタンのクラス
{
public function Button(label:String, width:int = 0):void
{
filters = [new GlowFilter(0xffffff,.5)];
var up:Sprite = _buildImage(label, 0xCCCCCC, width);
var over:Sprite = _buildImage(label, 0x87CEFA, width);
var down:Sprite = _buildImage(label, 0x4682B4, width);
down.y = 1;
super(up, over, down, up);
}
public function _buildImage(label:String, color:int, width:int = 0):Sprite
{
var text:TextField = new TextField();
text.defaultTextFormat = new TextFormat('Verdana', 10, 0x000000, true,
null, null, null, null,
TextFormatAlign.CENTER);
text.autoSize = TextFieldAutoSize.CENTER;
text.selectable = false;
text.text = label;
text.x = (width - text.width) >> 1;
text.y = 5;
var base:Shape = new Shape();
var g:Graphics = base.graphics;
g.beginFill(color);
g.drawRect(0, 0, width, text.height + 3);
g.endFill();
var sp:Sprite = new Sprite();
sp.addChild(base);
sp.addChild(text);
return sp;
}
}
class Singleton {
public static const NOTVISITED:int = 0;
public static const VISITED1:int = 1;
public static const VISITED2:int = 2;
public static const FINISH:int = 3;
public static const WHITE:int = 0xFFFFFF;
public static const RED:int = 0xFF0000;
public static const BLUE:int = 0x0000FF;
public static const GREEN:int = 0x00FF00;
}
import flash.display.SpreadMethod;
import flash.text.TextField;
class Node extends Sprite{ // ノードの情報を管理する。
private var this_x:Number, this_y:Number, r:Number, id:Number;
private var tf:TextField;
public var state:int;
public var circle:Sprite;
function Node(xx:Number, yy:Number, idd:Number){ //コンストラクタ
r = 20;
this_x = xx;
this_y = yy;
id = idd;
/*
tf = new TextField();
tf.x = x - 6;
tf.y = y - 8;
tf.selectable = false;
tf.textColor = 0xFFFFFF;
tf.text += id;
addChild(tf);
*/
circle = new Sprite();
state = Singleton.NOTVISITED;
//state = Singleton.VISITED
//state = Singleton.RED
}
public function draw() {
var color:int;
if (state == Singleton.NOTVISITED) color = Singleton.WHITE
else if (state == Singleton.VISITED1) color = Singleton.RED;
else if (state == Singleton.VISITED2) color = Singleton.GREEN;
else color = Singleton.BLUE;
//circle.filters = [new GlowFilter(0x000000)];
circle.graphics.lineStyle(6.0, 0x000000);
circle.graphics.beginFill(color);
circle.graphics.drawCircle(getX(),getY(),getR());
circle.graphics.endFill();
addChild(circle);
}
public function getX():Number{
return this_x;
}
public function getY():Number{
return this_y;
}
public function getR():Number{
return r;
}
public function getT():TextField {
return tf;
}
}
import flash.display.Sprite
import flash.events.MouseEvent;
class Edge extends Sprite{ // エッジの情報を管理するクラス
private var line:Sprite; // ラインを描画するスプライト
private var tmp:Sprite; // lineのtemp
private var sx:Number, sy:Number, gx:Number, gy:Number,cost:Number; // 描画を始めるポイントと終えるポイント
private var tf:TextField; // コストを表示するテキストフィールド
function Edge(sxx:Number, syy:Number, gxx:Number, gyy:Number,ccost:Number) { //コンストラクタ
sx = sxx;
sy = syy;
gx = gxx;
gy = gyy;
cost = ccost;
tf = new TextField();
tf.x = 20;
tf.y = 10;
tf.text = "cost = ";
tf.text += cost;
tf.textColor = 0x000000;
}
public function drawLine():void { // エッジを描く
line = new Sprite();
line.graphics.lineStyle(6.0, 0x000000);
line.graphics.moveTo(sx,sy);
line.graphics.lineTo(gx,gy);
addChild(line);
tmp = line;
}
}
import flash.display.Sprite
import flash.filters.GlowFilter;
class Display extends Sprite{ // 描画処理をまとめて行うクラス
private var matrix:Array;
private var arr:Array;
function Display(m:Array,a:Array) { //コンストラクタ
matrix = m;
arr = a;
}
public function Draw():void // コレが呼び出されると描画を行う
{
/*
var back:Sprite = new Sprite();
back.graphics.beginFill(0x000000);
back.graphics.drawRect(0, 0, 800, 800);
back.graphics.endFill();
addChild(back);
*/
/*
var status:Sprite = new Sprite();
status.graphics.beginFill(0xFFFFFF);
status.graphics.drawRect(0,0,80,40);
status.graphics.endFill();
addChild(status);
*/
for (var i:int = 0 ; i < arr.length ; i++) { // ノードを配置
var circle:Sprite = new Sprite();
arr[i].draw();
addChild(arr[i]);
}
for (var i:int = 0 ; i < arr.length ; i++) { // エッジを配置
for (var j:int = i+1 ; j < arr.length ; j++) {
if (matrix[i][j] != 0) {
var line:Sprite = new Sprite();
var ang:Number = Math.atan2(arr[i].getY() - arr[j].getY() , arr[i].getX() - arr[j].getX());
var sx:Number, sy:Number, gx:Number, gy:Number;
sx = arr[i].getX() - Math.cos(ang) * arr[i].getR();
sy = arr[i].getY() - Math.sin(ang) * arr[i].getR();
gx = arr[j].getX() + Math.cos(ang) * arr[j].getR();
gy = arr[j].getY() + Math.sin(ang) * arr[j].getR();
var edge:Edge = new Edge(sx, sy, gx, gy, matrix[i][j]);
edge.drawLine();
addChild(edge);
}
}
}
}
}