Si entiendo el problema correctamente (y puede que no, siéntete libre de decirme si no lo hago) ¿quieres transformar una cuadrícula 2D en una matriz ordenada 1D, mientras que cada fila y columna ya está ordenada en la cuadrícula 2D?
El primer elemento en la lista en este caso tiene que ser la esquina superior izquierda ((0,0), por definición del problema). Después de esto, debe ser el elemento (1,0) o (0,1), ya que todos los demás serán más grandes que estos por definición.
Puede generalizar diciendo que el siguiente elemento más pequeño en la cuadrícula siempre está directamente debajo de un elemento ya utilizado (o el borde de la cuadrícula), y también a la derecha de un elemento ya utilizado (o el borde de la cuadrícula), ya que ambos son definido para ser más pequeño que él. Por lo tanto, en cada iteración solo debe considerar el valor más pequeño que cumpla con este requisito.
Puede mantener a los posibles candidatos en orden ordenado a medida que los encuentre (nunca más de dos estarán disponibles en una iteración), y en cada iteración verifique los nuevos valores disponibles (si los hay). Si son más bajos que el más bajo de los candidatos anteriores, agréguelos a la lista de inmediato y repita; de lo contrario, agregue el candidato anterior más bajo y compárelo con el siguiente más bajo, etc.
Desafortunadamente, no pretendo poder proporcionar una complejidad exacta de esto, ni afirmo que es lo más eficiente posible, ciertamente parece mejor que un enfoque ingenuo, y espero haberlo explicado lo suficientemente bien como para que lo entiendas.
EDITAR: Para las cuadrículas nd como esta, creo que se aplica el mismo principio básico, pero cada iteración pone a disposición n nuevos candidatos, y estos candidatos deben ser los elementos no utilizados más pequeños en cada una de las n dimensiones en este punto.