# Print 1..N² in NxN matrix, starting at bottom-right and zig-zag

## Question:

Given an input *n*, I want to print *n* lines with each *n* numbers such that the numbers 1 through *n²* are displayed in a zig-zag way, starting with 1 appearing at the bottom-right corner of the output matrix, and 2 at the end of the one-but-last row, …etc.

## Examples:

Given Input 3.

Print:

```
9 4 3
8 5 2
7 6 1
```

Given Input 1.

Print:

```
1
```

Given Input 4.

Print:

```
13 12 5 4
14 11 6 3
15 10 7 2
16 9 8 1
```

## Attempt

```
n = int(input("Enter dimensions of matrix :"))
m = n
x = 1
columns = []
for row in range(n):
inner_column = []
for col in range(m):
inner_column.append(x)
x = x + 1
columns.append(inner_column)
for inner_column in columns:
print(' '.join(map(str, inner_column)))
```

I’ve tried something like this, but it prints out the array incorrectly. Any ideas?

## Answers:

Your code explicitly performs `x = 1`

and then `x = x + 1`

in a loop. As you need the first column in reverse order, and there are `n*n`

numbers to output, instead the first top-left value should be `x = n * n`

and in the first column it should decrease like with `x = x - 1`

. The next column should be filled from end to start, and the next should be filled from start to end, …etc.

I would suggest making an iterator that visits *rows* in that zig-zag manner: 0, 1, 2, … n – 1, and then n – 1, n – 2, … 0, and back from the start. With that iterator you know exactly to which row you should append the next `x`

value:

```
# Helper function to generate row numbers in zig-zag order, for as
# long as needed.
def zigzag(n):
if n % 2:
yield from range(n)
while True:
yield from range(n - 1, -1, -1)
yield from range(n)
n = int(input("Enter dimensions of matrix :"))
matrix = [[] for _ in range(n)]
visit = zigzag(n)
for x in range(n*n, 0, -1):
matrix[next(visit)].append(x)
```

Then print it:

```
for row in matrix:
print(' '.join(map(str, row)))
```