对于给定的数字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
。我试图找到模式,但无法弄明白。任何帮助都会有所帮助。感谢
答案 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
。)
最后一个难题是我们想要使用的值实际上是q
和p
的最大值。如果检查矩阵,您将看到如果考虑每个行值和每个列值,则每个值的最大值用于相应的单元格。
因此在输出中使用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 down
,j
的值是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]
如您所见,该值仅在特定情况下发生变化。
如果-1
和i > 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;
}
如果这些陈述都不成立,则该值只保持不变。