Помогите решить задачу с матрицами на питон

Дана квадратная целочисленная матрица. Требуется переписать все её элементы в одномерный массив по следующему правилу: выбор элементов начинается из правого верхнего и левого нижнего угла и продолжается "змейкой" в сторону главной диагонали. На первой итерации после угловых элементов выбор производится в сторону левого верхнего угла. В конце записываются элементы главной диагонали от левого верхнего угла до правого нижнего. Входные данные: в первой строке число N - количество строк и столбцов в квадратной матрице, N не превышает 20. Далее в N строках по N чисел через пробел, каждое не превышает 100 по модулю. Выходные данные: получившийся массив, записанный в одну строку через пробел. пример

мой код работает только если матрица 3*3

kol=int(input())
a=[]
for i in range(kol):
    a.append(list(map(int, input().split())))
b=[]
kol-=1
for i in range(kol):
    for j in range(kol,0,-1):
        b.append(a[i][j]), b.append(a[j][i])
print(b)

Ответы (2 шт):

Автор решения: kasapovamir9
#include <bits/stdc++.h>
using namespace std;
int main(){
  //ifstream cin("input.txt");
  long long n;
  cin>>n;
  vector <vector <long long> > a(n,vector <long long> (n));
  vector <long long>ans(n*n);
  for(long long i=n-1;i>=0;i--)for(long long j=0;j<n;j++)cin>>a[i][j];
  long long i=n-1;long long j=n-1;
  ans[0]=a[i][j];
  
  i--;
  bool dir=1;
  long long cntr=2;
  while(i+j!=n-1){long long curdiag=i+j;
    if(dir==1){
      for(;i<n;i++){
        j=curdiag-i;
        ans[cntr]=a[i][j];
        cntr+=2;
      }
      i--;
      j--;
      dir=!dir;
    }
    else {
      for(;j<n;j++){
        i=curdiag-j;
        ans[cntr]=a[i][j];
        cntr+=2;
      }
      j--;
      i--;
      dir=!dir;
    }
  }
  dir=0;
  cntr=3;
  i=0;j=0;
  ans[1]=a[i][j];
  j++;
  while(i+j!=n-1){long long curdiag=i+j;
    if(dir==1){
      for(;i>=0;i--){
        j=curdiag-i;
        ans[cntr]=a[i][j];
        cntr+=2;
      }
      i++;
      j++;
      dir=!dir;
    }
    else {
      for(;j>=0;j--){
        i=curdiag-j;
        ans[cntr]=a[i][j];
        cntr+=2;
      }
      j++;
      i++;
      dir=!dir;
    }
  }
  j=0;i=n-1;
  long long curdiag=i+j;
  cntr=n*n-n;
  for(;i>=0;i--){
        j=curdiag-i;
        ans[cntr]=a[i][j];
        cntr++;
      }
  for(long long i=0;i<ans.size();i++)cout<<ans[i]<<" ";
}
→ Ссылка
Автор решения: splash58

сделаем несколько наблюдений

во-первых, четные элементы получаются из нечетных перестановкой индексов

во-вторых. если посмотреть на правый верхний угол матрицы, то индексы элементов выглядят так

             0,m
     0, m-1        1, m
2, m        1, m-1      0, m-2

если перевернуть второй ряд, то получается простой цикл

             0,m
      1, m         0, m-1
2, m        1, m-1        0, m-2

только брать ряды надо через раз - слева-направо и справа-налево

остальное просто код

matrix= [
    [13, 11, 3, 1],
    [12, 14, 9, 5],
    [4, 10, 15, 7],
    [2, 6, 8, 16]
]


m = len(matrix[0])
left = True
for i in range(m-1):
    pairs = []
    for j in range(i+1):
        pairs.append((j, m-i+j-1))
    if left:
        pairs = pairs[::-1]
    left = not left
    for x,y in pairs:
        print(matrix[x][y])
        print(matrix[y][x])
for i in range(m):
    print(matrix[i][i])
→ Ссылка