当前位置:编程学习 > C#/ASP.NET >>

用时方恨数学没学好:求矩阵移位算法

有二个4*16的数组A和B,依次顺序存放0-63自然数。现在 for i=0 to 63 循环,每次需要按序输出16行包含64个数的序列:
例如
i=0 输出:A0,A1...A63
i=1 输出:A4,A5...A63,B3,A0,A1,A2
i=2 输出:A8,A9...A63,B3,...,B7,A4,A5,A6
...
i=15 输出:A60,A61,A62,A63,B3,...,B59,...A58
i=16 输出:B3,A0,A1,A2,...,B63,A60,A61,A62
...
i=63 输出:B61,B62,B63,A60,B3,B0...B59
最后i=64 输出:B0,B1,...B63。完成一次循环
请给一个最简单的输出算法。

0 A0 A1 A2 A3
1 A4 A5 A6 A7
2 A8 A9 A10 A11
3 A12 A13 A14 A15
4 A16 A17 A18 A19
5 A20 A21 A22 A23
6 A24 A25 A26 A27
7 A28 A29 A30 A31
8 A32 A33 A34 A35
9 A36 A37 A38 A39
10 A40 A41 A42 A43
11 A44 A45 A46 A47
12 A48 A49 A50 A51
13 A52 A53 A54 A55
14 A56 A57 A58 A59
15 A60 A61 A62 A63
16 B3 A0 A1 A2
17 B7 A4 A5 A6
18 B11 A8 A9 A10
19 B15 A12 A13 A14
20 B19 A16 A17 A18
21 B23 A20 A21 A22
22 B27 A24 A25 A26
23 B31 A28 A29 A30
24 B35 A32 A33 A34
25 B39 A36 A37 A38
26 B43 A40 A41 A42
27 B47 A44 A45 A46
28 B51 A48 A49 A50
29 B55 A52 A53 A54
30 B59 A56 A57 A58
31 B63 A60 A61 A62
32 B2 B3 A0 A1
33 B6 B7 A4 A5
34 B10 B11 A8 A9
35 B14 B15 A12 A13
36 B18 B19 A16 A17
37 B22 B23 A20 A21
38 B26 B27 A24 A25
39 B30 B31 A28 A29
40 B34 B35 A32 A33
41 B38 B39 A36 A37
42 B42 B43 A40 A41
43 B46 B47 A44 A45
44 B50 B51 A48 A49
45 B54 B55 A52 A53
46 B58 B59 A56 A57
47 B62 B63 A60 A61
48 B1 B2 B3 A0
49 B5 B6 B7 A4
50 B9 B10 B11 A8
51 B13 B14 B15 A12
52 B17 B18 B19 A16
53 B21 B22 B23 A20
54 B25 B26 B27 A24
55 B29 B30 B31 A28
56 B33 B34 B35 A32
57 B37 B38 B39 A36
58 B41 B42 B43 A40
59 B45 B46 B47 A44
60 B49 B50 B51 A48
61 B53 B54 B55 A52
62 B57 B58 B59 A56
63 B61 B62 B63 A60
64 B0 B1 B2 B3
65 B4 B5 B6 B7
66 B8 B9 B10 B11
67 B12 B13 B14 B15
68 B16 B17 B18 B19
69 B20 B21 B22 B23
70 B24 B25 B26 B27
71 B28 B29 B30 B31
72 B32 B33 B34 B35
73 B36 B37 B38 B39
74 B40 B41 B42 B43
75 B44 B45 B46 B47
76 B48 B49 B50 B51
77 B52 B53 B54 B55
78 B56 B57 B58 B59
79 B60 B61 B62 B63
--------------------编程问答-------------------- 思路没问题 你测试一下吧 我现在不能测

for(int i=0;i<16;i++)
{
 for(int k=i;k<16;i++)
 {
  for(int j=0;j<4;j++)
   {
    system.console.WriteLine(A[i][j]);
   }
 }
 for(int k=16-i;k<16;i++)
 {
  for(int j=0;j<4;j++)
   {
    system.console.WriteLine(A[i][j]);
   }
 }
}
--------------------编程问答-------------------- 感谢您的解答,但是输出的序列并不符合要求。 --------------------编程问答-------------------- 好大一串数字眼花了,帮顶。 --------------------编程问答-------------------- 我觉得楼主没有把题目说清楚........... --------------------编程问答-------------------- 帮顶,练习一下 --------------------编程问答-------------------- 没看明白  
i=15 输出:A60,A61,A62,A63,B3,...,B59,...A58 
i=16 输出:B3,A0,A1,A2,...,B63,A60,A61,A62 
16行为什么开头是B3.. --------------------编程问答--------------------
引用楼主 mynull 的帖子:
有二个4*16的数组A和B,依次顺序存放0-63自然数。现在 for i=0 to 63 循环,每次需要按序输出16行包含64个数的序列:
例如
i=0 输出:A0,A1...A63
i=1 输出:A4,A5...A63,B3,A0,A1,A2
i=2 输出:A8,A9...A63,B3,...,B7,A4,A5,A6
...
i=15 输出:A60,A61,A62,A63,B3,...,B59,...A58
i=16 输出:B3,A0,A1,A2,...,B63,A60,A61,A62
...
i=63 输出:B61,B62,B63,A60,B3,B0...B59
最后i=64 输出:B0,B1,...B63。…


前面 15行有规律可循。
后面 就不明白了。。 --------------------编程问答-------------------- 没看明白 --------------------编程问答-------------------- 看了好久终于明白了。。。。。
解题思路:
数组A[16,4] B[16,4] C[16,8],合并A和B,使得
C的前四烈是B的元素,后四烈是A的元素,然后依据要求输出元素,代码贴出...给分结帖

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintArray();
        }
        //产生两个数组
        public static void GenerateArray(out string[,] A, out string[,] B)
        {
            A = new string[16, 4];
            B = new string[16, 4];
            int no = 0;
            for (int i = 0; i < 16; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    no = i * 4 + j;
                    A[i, j] = "A" + no.ToString();
                    B[i, j] = "B" + no.ToString();
                }
            }
        }
        //将两个数组合并成16X8的数组
        public static void UnitArray(out string[,] C)
        {
            C = new string[16, 8];
            string[,] A = new string[16, 4];
            string[,] B = new string[16, 4];
            GenerateArray(out A, out B);
            for (int i = 0; i < 16; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    if (j >= 4)//后四烈是A的元素
                        C[i, j] = A[i, j - 4];
                    else//前四烈是B的元素   以方便输出
                        C[i, j] = B[i, j];
                    // Console.Write("{0,5}", C[i, j]);
                }
                //Console.WriteLine();
            }
            // Console.Read();
        }
        //按要求输出数组from m to n 每次输出m后4列列元素 本例题输出4-0列
        public static void PrintArray()
        {
            string[,] C = new string[16, 8];
            int RowNo = 0;
            UnitArray(out C);

            for (int j = 4; j >= 0; j--)
            {
                for (int i = 0; i < 16; i++)
                {
                    Console.WriteLine("{0,2}:{1,5}{2,5}{3,5}{4,5}", RowNo, C[i, j], C[i, j + 1], C[i, j + 2], C[i, j + 3]);
                    RowNo++;
                }
            }

            Console.Read();
        }
    }
}

补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,