piliskys

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            25 隨筆 :: 0 文章 :: 40 評論 :: 0 Trackbacks

          今天在網上看到一個{找跳馬最短路徑的算法} Find shortest way of a Chinese chess horse that jump from (0, 0) to (m, n) in a grid area of m*n, and output the step number and way points. For example, in a grid area of (3 * 2), a horse can jump as (0, 0)->(1, 2)->(2, 0)->(3,2). And step number is 3. 感覺在一個m*n的矩陣中跳要考慮邊界問題,在此用java寫了一下,沒有考慮邊界,以下程序只在無限二維中成立
          代碼如下

          /**
          ?*?
          @author ?:?<a?href="piliskys@163.com">piliskys</a>
          ?*?Date:?2006-2-22
          ?*?Time:?13:50:56
          ?*?找跳馬最短路徑的算法
          ?*?
          ?
          */

          public ? class ?HorsePro? {
          ????
          public ? static ? void ?main(String[]?arg)? {
          ????????HorsePosition?start?
          = ? new ?HorsePosition( 0 ,? 0 );
          ????????HorsePosition?end?
          = ? new ?HorsePosition( 0 , 1 );
          ????????
          int ?index = 0 ;
          ????????
          while ?( true )? {
          ???????????????index
          ++ ;
          ????????????HorsePosition?her?
          = ?getNext(start,?end);
          ????????????
          if ?(her.positionX? == ? 0 ? && ?her.positionY? == ? 0 || index == 7 )
          ????????????????
          break ;
          ????????????start?
          = ? new ?HorsePosition(start.positionX? + ?her.positionX,?start.positionY? + ?her.positionY);
          ????????????System.out.println(
          " 第[ " + index + " ]步=> " + start);
          ????????}

          ????}

          ??????
          /** ? */ /**
          ???????*?以下為構造一個位置類
          ???????
          */

          ????
          static ? class ?HorsePosition? {
          ????????HorsePosition(
          int ?a,? int ?b)? {
          ????????????
          this .positionX? = ?a;
          ????????????
          this .positionY? = ?b;
          ????????}

          ????????
          int ?positionX;
          ????????
          int ?positionY;
          ????????
          public ?String?toString()? {
          ????????????
          return ? " [ " ? + ? this .positionX? + ? " , " ? + ? this .positionY? + ? " ] " ;
          ????????}

          ????}


          ????
          public ? static ?HorsePosition?getNext(HorsePosition?a,?HorsePosition?b)? {
          ????????
          int ?x,?y,?z;
          ????????x?
          = ?b.positionX? - ?a.positionX;
          ????????y?
          = ?b.positionY? - ?a.positionY;
          ????????z?
          = ?Math.abs(x)? + ?Math.abs(y);
          ????????
          if ?(z? >= ? 3 )? {
          ????????????
          if ?(Math.abs(x)? > ?Math.abs(y))? {
          ????????????????
          int ?yy;
          ????????????????
          if ?(y? == ? 0 )??yy? = ? 1 ;
          ????????????????
          else
          ????????????????????yy?
          = ?y? / ?Math.abs(y);

          ????????????????
          return ?( new ?HorsePosition( 2 ? * ?x? / ?Math.abs(x),?yy));

          ????????????}
          ? else
          ????????????
          {
          ????????????????
          int ?xx;
          ????????????????
          if ?(x? == ? 0 )??xx? = ? 1 ;
          ????????????????
          else
          ????????????????????xx?
          = ?x? / ?Math.abs(x);
          ????????????????
          return ?( new ?HorsePosition(xx,? 2 ? * ?y? / ?Math.abs(y)));
          ????????????}

          ????????}
          ? else
          ?????????
          if ?(z? == ? 2 ) {

          ????????????
          if (x == 0 ) {
          ????????????????
          return ???? new ?HorsePosition( 2 ,y / 2 ?);
          ????????????}

          ????????????
          if (y == 0 ) {
          ????????????????
          return ???? new ?HorsePosition(x / 2 , 1 ?);
          ????????????}

          ??????????
          if (x * y != 0 ) {
          ?????????????
          return ???? new ?HorsePosition( 2 * x, - y?);
          ??????????}

          ?????????}

          ?????????
          else ? if (z == 1 ) {? // 說明z==1的情況了
          ????????????? if (x == 0 ) {
          ???????????????
          return ????? new ?HorsePosition( 1 , 2 * y?);
          ?????????????}

          ?????????????
          else
          ????????
          return ????? new ?HorsePosition( 2 * x, 1 ?);
          ?????????}


          ??????
          // 以下說明完成了
          ??????? return ?? new ???HorsePosition( 0 , 0 ?);

          ????}



          }

          posted on 2006-03-20 14:36 霹靂火 閱讀(1240) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 湄潭县| 新竹县| 阿克| 北辰区| 师宗县| 宜昌市| 南部县| 通渭县| 突泉县| 宜阳县| 丰顺县| 大竹县| 吉隆县| 通渭县| 大理市| 新丰县| 新干县| 平安县| 牟定县| 宜宾县| 如东县| 宁夏| 阿巴嘎旗| 秀山| 双流县| 建平县| 深水埗区| 永善县| 石景山区| 宜都市| 巴马| 会昌县| 合山市| 平乡县| 宁津县| 甘洛县| 中宁县| 靖边县| 和田县| 湾仔区| 本溪市|