'Why are my matrix values being reset back to 1?

I can't seem to figure out why the values of the first column after the 3 are being reset to 1 and then 1 again. I think it has to do with the not 999 if statement, but I'm not sure what to add or change. Any help is appreciated thank you!

n = 15 #the number the matrices will be an n*n of
a = [[ 0 for x in range(n)] for x in range(n)]
a[-1][-1] =111
a[0][3] =999

def Manhattan(x):
    k = 1
    m = 1
    for i in range(n):
        for j in range(n):
            if (x[i][j] < 1):
                if (x[j][i] < 1):
                    if (x[i][j-1] != 999 or  x[j-1][i] !=999 ):
                            k = x[i][j-1]
                            x[i][j] = k + 1
                            m = x[j-1][i]
                            x[j][i] = m + 1
                else:
                    k = x[i][j]
                    x[i][j] = k + 1
    for row in x:
        print()
        for val in row:
            print('%4d' %val, end = " ")

Manhattan(a)


Solution 1:[1]

im not completely sure what your program is meant to do but i think this is what youre trying to achieve as output:

   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 
   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
   3    4    5    6    7    8    9   10   11   12   13   14   15   16   17
   4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
   5    6    7    8    9   10   11   12   13   14   15   16   17   18   19
   6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
   7    8    9   10   11   12   13   14   15   16   17   18   19   20   21
   8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23 
  10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
  11   12   13   14   15   16   17   18   19   20   21   22   23   24   25
  12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
  13   14   15   16   17   18   19   20   21   22   23   24   25   26   27
  14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
  15   16   17   18   19   20   21   22   23   24   25   26   27   28   29 

code:

n = 15 #the number the matrices will be an n*n of
a = [[ 0 for x in range(n)] for x in range(n)]
a[-1][-1] = 111
a[0][3] = 999

def Manhattan(x1):
    start_value = 0

    for x in range(n):
        start_value += 1
        second_val = start_value
        for y in range(n):
            x1[y][x] = second_val
            second_val += 1

    for line in x1:
        for char in line:
            print('%4d' %char, end = " ")
        print()

Manhattan(a)

your code is fairly unorganized it makes it hard to understand but if this was your goal then what you need to do is increment a value starting from 1 by 1 each outer loop while looping through the matrix and then every iteration of the inner loop you increase it by 1 and set the value into the corresponding index.

Solution 2:[2]

I think your question is why x[0][3] equals 1 after calling the function Manhattan, well that because your else statement is compare with if (x[j][i] < 1) statement.

So, when the code go on x[3][0], the if (x[0][3]) will equal False, then go to the else statement, that means: k=x[3][0]=0, and then x[3][0]=0+1=1.

I'm not sure if this output is your expectation:

   1    2    3 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 
   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
   3    4    5    6    7    8    9   10   11   12   13   14   15   16   17 
   4    5    6    7    8    9   10   11   12   13   14   15   16   17   18 
   5    6    7    8    9   10   11   12   13   14   15   16   17   18   19 
   6    7    8    9   10   11   12   13   14   15   16   17   18   19   20 
   7    8    9   10   11   12   13   14   15   16   17   18   19   20   21 
   8    9   10   11   12   13   14   15   16   17   18   19   20   21   22 
   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23 
  10   11   12   13   14   15   16   17   18   19   20   21   22   23   24 
  11   12   13   14   15   16   17   18   19   20   21   22   23   24   25 
  12   13   14   15   16   17   18   19   20   21   22   23   24   25   26 
  13   14   15   16   17   18   19   20   21   22   23   24   25   26   27 
  14   15   16   17   18   19   20   21   22   23   24   25   26   27   28 
  15   16   17   18   19   20   21   22   23   24   25   26   27   28  111

Code:

def Manhattan(x):
    for i in range(n):
        for j in range(n):
            if x[i][j] == 111:
                break
            up = 0
            left = 0
            if x[i-1][j] > 0 and bool(i):
                up = x[i-1][j]
            if x[i][j-1] > 0 and bool(j):
                left = x[i][j-1]

            if bool(up) and bool(left):
                x[i][j] = x[i][j] + min(up, left) + 1
            elif bool(up):
                x[i][j] = x[i][j] + up + 1
            elif bool(left):
                x[i][j] = x[i][j] + left + 1
            else:
                x[i][j] = x[i][j] + 1

    for row in x:
        print()
        for val in row:
            print('%4d' %val, end = " ")

Solution 3:[3]

Figured it out myself! The issue was that when checking j-1 != 999 it was eqaul to 999 for x[0][3] so it would never fill out those elements correctly. Fixed it by changing the else statement and adding in a second if statement for j-1 == 999

n = 10 #the number the matrices will be an n*n of


a = [[ 0 for x in range(n)] for x in range(n)]

a[-1][-1] =111

a[0][6] =999

def Manhattan(x):

    k = 1

    m = 1

    for i in range(n):

        for j in range(n):

            if (x[i][j] < 1):

                if (x[j][i] < 1):

                    if (x[i][j-1] != 999 and  x[j-1][i] !=999 ):

                            k = x[i][j-1]

                            x[i][j] = k + 1

                            m = x[j-1][i]

                            x[j][i] = m + 1

                    if (x[i][j-1] == 999 or  x[j-1][i] ==999 ):
                            
                            k = x[i][j-2]
                            x[i][j] = k + 4
                            m = x[j-2][i]
                            x[j][i] = m + 2
                else:

                    k = x[i][j]

                    x[i][j] = k + 4

    for row in x:

        print()

        for val in row:

            print('%4d' %val, end = " ")


Manhattan(a)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Punzicul
Solution 2
Solution 3