IIJIMASが勉強しようとしています。

これからこれから♪

目次

Blog 利用状況

ニュース

共著:




わんくま同盟 東京勉強会 #99 私の資料

個数を数えてみたい!

わんくま同盟 東京勉強会 #91 私の資料

きっと楽しいトポロジー

わんくま同盟 東京勉強会 #45 数学デー 私の資料(pptxとxlsx)

確率の不思議

わんくま同盟 東京勉強会 #37 私のLT資料

数の冪の和の式 を求めてみよう!

デブサミ09でわんくま同盟の紹介をしたスライド

わんくま同盟 東京勉強会 #26 LT祭りの私のスライド

わんくま同盟 東京勉強会 #23の私のスライド

わんくま同盟 東京勉強会 #18の私のスライド


自己紹介(仮)

IIJIMASと申します。
東京都多摩市在住です。多摩川のそばです。
猫好きです。
IIJIMASのSは何って言われます。 IIJIMASって
なんて読むかは自由です。
魚や網間企業とゲームとは無関係です。
数学とか宇宙とかの読み物とか好きです。
血液型:果汁100%A
メタボ予備軍。。。orz
Twitter

...............
MVP 審査応募ページ~ 求む、日本のMVP。
MCTS:.NET Framework 2.0: Windows アプリケーション
MCTS:.NET Framework 2.0: Windows アプリケーション

MCSD.NET:マイクロソフト認定ソリューションデベロッパー(MCSD) Microsoft .NET トラック
Microsoft Certified Solution Developer for Microsoft.NET

リンク

わんくま同盟
わんくま同盟

C#VB.NET掲示板
C#VB.NET掲示板

わんくま同盟 Blog's

ちょっと一言(仮)


書庫

日記カテゴリ

有名なのに再帰使わないでみる。

再帰使わないで強引にやってみました。
といっても再帰使ったのと同じ考え方ですが…

ネタ元 →有名な、あまりに有名な
    → 開発記その13


///

/// 変数の中身を入れ替える

///

public static void Swap(ref T x, ref T y)

{

    T temp = y;

    y = x;

    x = temp;

}

 

///

/// 作業状態

///

public enum WorkState {

    //処理開始

    Starting = 0,

    //対象の円盤の移動

    Moving = 1,

    //下の大きい円盤の処理に戻る

    Returning = 2

}

 

///

/// 手順を表示する

///

public static void Move2(int N, char from, char via, char to)

{

    if (N <= 0) { return; }

    WorkState[] state = new WorkState[N];

    state[0] = WorkState.Starting;

    int Disk = N;//処理したい円盤

    int count = 0;

    do

    {

        if (state[N - Disk] == WorkState.Moving || Disk == 1)

        {

            //円盤を移動する

            Console.WriteLine("{3,5} : 円盤{0} {1} から{2} ", Disk, from, to, ++count);

        }

        if (Disk == 1)

        {

            //戻る

            state[N - Disk] = WorkState.Returning;

        }

        if (state[N - Disk] == WorkState.Starting

            || state[N - Disk] == WorkState.Returning

            && state[N - Disk - 1] == WorkState.Starting)

        {

            //作業用の棒と移し先の棒を入れ替える

            Swap<char>(ref to, ref via);

        }

        else

        {

            //作業用の棒と移し元の棒を入れ替える

            Swap<char>(ref from, ref  via);

        }

        if (state[N - Disk] == WorkState.Returning)

        {

            //下の大きい円盤の処理に戻る

            Disk++;

            //状態を次に移す

            state[N - Disk]++;

        }

        else {

            //上の小さい円盤を処理対象にする

            Disk--;

            state[N - Disk] = WorkState.Starting;

        }

    } while (Disk < N || state[0] != WorkState.Returning);

}


やっぱ再帰使わないとわかりにくいですね…
でもN=8あたりからは再帰のより速いかも。 ←遅かったです…
やっぱりHanoiの塔は再帰との相性がいいですね。

投稿日時 : 2007年9月16日 21:09

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント