对于给定的数字,以下列格式打印矩阵

时间:2016-06-14 08:22:24

标签: c#

对于给定的数字n,我必须打印以下矩阵(n = 3示例):

 3 3 3 3 3 
 3 2 2 2 3 
 3 2 1 2 3 
 3 2 2 2 3 
 3 3 3 3 3 

行数和列数应为(2 * n) - 1。我试图找到模式,但无法弄明白。任何帮助都会有所帮助。感谢

3 个答案:

答案 0 :(得分:5)

这样的事情:

private static int[][] Matrix(int n) {
  // Create arrays
  int[][] result = Enumerable.Range(0, 2 * n - 1)
    .Select(_ => new int[2 * n - 1])
    .ToArray();

  // Feed arrays
  for (int i = 1; i <= n; ++i) {
    int from = i - 1;
    int to = 2 * n - i - 1;
    int v = n - i + 1;

    for (int j = from; j <= to; ++j) {
      result[from][j] = v;
      result[to][j] = v;
      result[j][from] = v;
      result[j][to] = v;
    }
  }

  return result;
}

....

int n = 3;

String report = String.Join(Environment.NewLine, Matrix(n)
  .Select(line => String.Join(" ", line)));

Console.Write(report);

n = 3的输出

   3 3 3 3 3
   3 2 2 2 3
   3 2 1 2 3
   3 2 2 2 3
   3 3 3 3 3

对于n = 4

   4 4 4 4 4 4 4
   4 3 3 3 3 3 4
   4 3 2 2 2 3 4
   4 3 2 1 2 3 4
   4 3 2 2 2 3 4
   4 3 3 3 3 3 4
   4 4 4 4 4 4 4

答案 1 :(得分:4)

这是一个不使用任何中间存储的版本:

event.currentTarget.value

其工作原理如下:

外环(i)和内环(j)均为0 ... 2 * n-1。

但是,我们要打印的值(static void printMatrix(int n) { int x = 2*n - 1; for (int i = 0, p = n; i < x; ++i, p += (i > x/2) ? 1 : -1) { for (int j = 0, q = n; j < x; ++j, q += (j > x/2) ? 1 : -1) Console.Write(Math.Max(p, q) + " "); Console.WriteLine(); } } p)从q开始,然后减少到矩阵的中间/下方,此时它们会再次开始增加。

我们可以通过检查循环变量来确定是否增加或减少这些值,以查看它是否在矩阵的中间/下方。如果是,我们减少,否则我们增加。

这就是这样做:n

如果p += (i > x/2) ? 1 : -1,那么值i > x/2将用于增量,否则1将用于增量(即它将减少)。

(同样适用于-1。)

最后一个难题是我们想要使用的值实际上是qp最大值。如果检查矩阵,您将看到如果考虑每个行值和每个列值,则每个值的最大值用于相应的单元格。

因此在输出中使用q

答案 2 :(得分:2)

到目前为止,这里有一个简单的解决方案,不那么复杂和快速:

private static void printMatrix(int n)
{
    // length of the matrix in one dimension
    int length = (2 * n) - 1;
    // iterate through y axis of the matrix
    for (int i = 0; i < length; i++)
    {
        int value = n;
        // iterate through x axis of the matrix
        for (int j = 0; j < length; j++)
        {
            Console.Write(value);

            if (i > j && i + j < length - 1)
            {
                value--;
            }
            else if (i <= j && i + j >= length - 1)
            {
                value++;
            }
        }
        Console.WriteLine();
    }
}

if语句的说明

首先看看矩阵,就像它是一个数组一样,查看索引和值以及在两个for语句中迭代数组时会发生什么变化,而i的值是对于y axis, from up to downj的值是x axis, from left to right

// +1 and -1 means the changes of the values

0,0    0,1    0,2    0,3    0,4    // values of i,j (first is i, second is j)
[3]    [3]    [3]    [3]    [3]    // printed value

1,0    1,1    1,2    1,3    1,4
[3] -1 [2]    [2]    [2] +1 [3]

2,0    2,1    2,2    2,3    2,4
[3] -1 [2] -1 [1] +1 [2] +1 [3]

3,0    3,1    3,2    3,3    3,4
[3] -1 [2]    [2]    [2] +1 [3]

4,0    4,1    4,2    4,3    4,4
[3]    [3]    [3]    [3]    [3]

如您所见,该值仅在特定情况下发生变化。

如果-1i > j,则会发生i + j < length - 1,否则在索引3,1之后您会有错误的值,之后它不应该减去该值更多。 这两个if语句引导我们进入代码中的第一个语句:

if (i > j && i + j < length - 1)
{
    value--;
}

现在+1如果i + j >= length - 1也会发生3,1,但+1之类的其他值也不会将i <= j添加到值,只会增加else if (i <= j && i + j >= length - 1) { value++; } FileProvider ,它引导我们到代码中的第二个if语句:

    private static PathStrategy parsePathStrategy(Context context, String authority)
        ...
        int type;
        while ((type = in.next()) != END_DOCUMENT) {
            if (type == START_TAG) {
                final String tag = in.getName();
                final String name = in.getAttributeValue(null, ATTR_NAME);
                String path = in.getAttributeValue(null, ATTR_PATH);
                File target = null;
                if (TAG_ROOT_PATH.equals(tag)) {
                    target = buildPath(DEVICE_ROOT, path);
                } else if (TAG_FILES_PATH.equals(tag)) {
                    target = buildPath(context.getFilesDir(), path);
                } else if (TAG_CACHE_PATH.equals(tag)) {
                    target = buildPath(context.getCacheDir(), path);
                } else if (TAG_EXTERNAL.equals(tag)) {
                    target = buildPath(Environment.getExternalStorageDirectory(), path);
                }
                if (target != null) {
                    strat.addRoot(name, target);
                }
            }
        }
        return strat;
    }

如果这些陈述都不成立,则该值只保持不变。