一切皆可抽象

          大而無形 庖丁解牛 厚積薄發 滌慮玄覽
             ::  ::  ::  ::  :: 管理

          【原創】關于一個矩陣算法

          Posted on 2005-09-05 14:24 鋒出磨礪 閱讀(1834) 評論(4)  編輯  收藏 所屬分類: java算法

          結果
          順時針

          01   02   03   04  

          10   11   12   05  

          09   08   07   06  

          逆時針

          04   03   02   01  

          05   12   11   10  

          06   07   08   09  

          代碼
          public class test {
            public test() {
            }
            private static int[][] data = null;

            private int datai = 1;    //數值
            private static int  h =0, i=0, j;
            private int row1 =0,col1 =0,row2=0,col2=0;
           
            static int x=3,y=4;    // x=? y=?

            public static void main(String[] args)
            {
               j = y-1;
               data = new int[x][y];  //data init  定義了x行 y列的矩陣 用于存放數據
               test t = new test();
               t.input(1);           //開始數據塞入 1表示 從左到右
               //數據輸出
               System.out.println("順時針");
               for (int ki=0;ki     {
                 for (int kj=0;kj       {

                   System.out.print(addZero(String.valueOf(x*y).length(),data[ki][kj])+"   ");
                 }
                 System.out.println("");
               }


               System.out.println("逆時針");
               int[][] kk = niuniu(data,x,y); //矩陣倒置
               for (int ki=0;ki     {
                 for (int kj=0;kj       {

                   System.out.print(addZero(String.valueOf(x*y).length(),kk[ki][kj])+"   ");
                 }
                 System.out.println("");
               }


            }

            private  void input(int typej)
            {
               if (datai > x*y)
               {
                 //System.out.println("exit");如果數據塞入到頭 退出遞歸
               }
               else
               {


                //從左到右塞入數據
                if (typej == 1) {
                   for (int k = i; k <= j; k++) {
                     data[h][k] = datai++;
                   }

                   row1++;  //上面走了一行
                   h = y - 1 - col1;  //下一步從上到下表示的列值
                   i = row1;          //行起始
                   j = x - 1 - col1;  //行終止
                   input(2);         //從上到下遍歷數據
                 }

                 //從上到下塞入數據
                 if ( typej == 2) {
                   for (int k = i; k <= j; k++) {
                      data[k][h] = datai++;
                    }

                   col1++;  //左邊走了一列
                   h = x - 1 - row2;  //下一步從右到左表示的行值
                   i = y - 1 - col1;  //列起始
                   j = col2;          //列終止
                   input(3);          //從右到左遍歷數據
                 }

                 //從右到左塞入數據
                 if ( typej == 3) {
                   for (int k = i; k >= j; k--) {
                     data[h][k] = datai++;
                   }

                   row2++;  //下面走了一行
                   h = col2;  //下一步從下到上表示的列值
                   i = x - 1 - row2;   //行起始
                   j = row1;           //行終止
                   input(4);           //從下到上遍歷數據
                 }

                 //從下到上塞入數據
                 if (typej == 4) {
                   for (int k = i; k >= j; k--) {
                     data[k][h] = datai++;
                   }

                   col2++;  //左面走了一列
                   h = row1;  //下一步從左到右的行值
                   i = col2;   //列起始
                   j = y - 1 - col1;  //列終止
                   input(1);
                 }
               }
            }

              //補位
              public static String addZero(int weishu, int num) {
              /* int num=new Integer(num).intValue();*/
              int len = Integer.toString(num).length();
              if (len >= weishu) {
                return Integer.toString(num);
              }
              int i = 0;
              int j = weishu - len;
              String BH = "";
              while (i < j) {
                BH = "0" + BH;
                i = i + 1;
              }
              BH = BH + Integer.toString(num);
              return BH;
            }

            //列copy,第1列和最后一列互換 依次類推
            public static int[][] niuniu(int[][] temp,int xi,int yi)
            {
              int[][] rs = new int[xi][yi];
              int foxi = yi/2;
              for (int i=0;i    {
                for (int j=0;j      {
                  rs[j][yi-1-i] = temp[j][i];
                }
              }
              int col = foxi-1;
              int k = 0;
              if (yi%2 == 0)
              {
                k = foxi;
              }
              else
              {
                k = foxi +1;
              }
              for (int i=k;i<=yi-1;i++)
              {
                for (int j=0;j      {
                  rs[j][col] = temp[j][i];
                }
                col--;
              }

              if (yi%2 == 0)
              {
              }
              else
              {
               for (int j=0;j     {
                rs[j][foxi] = temp[j][foxi];
               }

              }

              return rs;
            }


          }


          評論

          # re: 關于一個矩陣算法  回復  更多評論   

          2005-09-05 19:46 by Pudgy's World
          這個就是螺旋虧陳矩陣吧。

          # re: 關于一個矩陣算法  回復  更多評論   

          2005-09-05 19:49 by 鋒出磨礪
          對 算法比較老土 。如果誰有更好的 請貼出共同參考學習。

          # re: 關于一個矩陣算法  回復  更多評論   

          2005-09-06 11:36 by ^ Mustang ^
          我們當初C語言考試的大題里有一道這樣的

          # re: 【原創】關于一個矩陣算法  回復  更多評論   

          2006-05-29 20:19 by 月摻
          class Test5{
          public static void main(String[] args){
          final int count = 10;
          int k = 1;
          int[][] a = new int[count][count];
          for (int n = 0; n<(count+1)/2; n++){ //從外往里需要(count+1)/2圈
          for (int i = n; i<count - n; i++){ //上橫行
          a[i][n] = k++;
          }
          for (int i = n + 1; i<count - n; i++){ //右豎行
          a[count-n-1][i] = k++;
          }
          for (int i = count-n-2; i>=n; i--){ //下橫行
          a[i][count-n-1] = k++;
          }
          for (int i = count-n-2; i>n; i--){ //左豎行
          a[n][i] = k++;
          }
          }
          for (int i = 0; i<count; i++){
          for (int j = 0; j<count; j++)
          System.out.print (a[i][j] + " ");
          System.out.println ();
          }
          }
          }
          我們老師寫的。
          主站蜘蛛池模板: 镇雄县| 肥乡县| 松溪县| 盐源县| 旌德县| 梁河县| 武宁县| 黄冈市| 眉山市| 台北市| 库尔勒市| 胶南市| 舟山市| 乐清市| 兰西县| 伊春市| 大兴区| 苏尼特右旗| 华坪县| 新干县| 龙井市| 积石山| 临洮县| 崇仁县| 阿图什市| 安康市| 乾安县| 晴隆县| 延吉市| 泸定县| 海兴县| 定陶县| 玛沁县| 宣武区| 唐河县| 隆安县| 陆丰市| 秭归县| 郧西县| 仙游县| 吴江市|