2014-12-04 3 views
1

У меня проблема с задачей для моей ИТ-школы. Проблема заключается в следующем: Поверните рамку массива влево. Вход: Сначала получите количество тестов (t). Затем для каждого теста получаем l и k (строка и столбец), 3 < = l, k < = 100. Затем заполните матрицу цифрами от пользователя.Вращающийся двумерный массив целых чисел

Input: 
1 
3 3 
1 2 3 
4 5 6 
7 8 9 

Output: 
2 3 6 
1 5 9 
4 7 8 

Мой код до сих пор:

#include<iostream> 
#include<cstdio> 
#include<cstdlib> 

int main() 
{ 
    int t, w, k; 
    int tab[101][101]; 
    int t1[101], t2[101], t3[101], t4[101]; 
    scanf_s("%d", &t); 
    for (int i = 0; i < t; i++) { 
     scanf_s("%d %d", &w, &k); 
     for (int j = 0; j < w; j++) { 
      for (int x = 0; x < k; x++) { 
       scanf_s("%d", &tab[j][x]); 
       if (j == 0) {     //1 linia 
        t1[x] = tab[j][x];   
       } 
       if (j + 1 == w) {    //3 linia 
        t2[x] = tab[j][x]; 
       } 
       if (x == 0) {     //2 linia 
        t3[j] = tab[j][x]; 
       } 
       if (x + 1 == k) {    //4 linia 
        t4[j] = tab[j][x]; 
       } 
      } 
     } 
    printf("\n"); 
    } 

    for (int j = 0; j < w; j++) { 
     for (int x = 0; x < k; x++) { 

      if (j == 0) { 
       if (x == 0) { 
        tab[j][x] = t3[1]; 
       } 
       else if (x + 1 != k-1) { 
        tab[j][x] = t1[j + 1]; 
       } 
       else if (x + 1 == k-1) { 
        tab[j][x] = t4[1]; 
       } 
      } 
      if (j + 1 == w) { 
       if (x == 0) { 
        tab[j][x] = t3[k - 2]; 
       } 
       else if (x + 1 == k - 1) { 
        tab[j][x] = t4[w-2]; 
       } 
       else if (x + 1 != k-1) { 
        tab[j][x] = t2[x + 1]; 
       } 
      } 
     } 
    } 

    for (int j = 0; j < w; j++) { 
     for (int x = 0; x < k; x++) { 
      printf("%d ", tab[j][x]); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 
    system("pause"); 
    return 0; 
} 

Я знаю, что я делаю неправильно репозиционирования. Я попробовал это как 5 различных способов. Если бы кто-нибудь показывал мне способ повторения через таблицу движущихся значений влево. Буду признателен. Также имейте в виду, что я не должен быть равен k.

+0

Какие еще четыре вещи вы пробовали? Почему они ошибались? Почему эта попытка ошибочна? Вы вначале решили проблему логически? Вы понимаете каждый шаг, который вы должны предпринять для решения проблемы? Наконец, если вы это сделали, вы должны прочитать [эту замечательную статью Эрика Липперта] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) о том, как отлаживать небольшие программы, такие как как ваш. –

+0

«Поверните рамку массива влево» - это не очень точная постановка задачи. (И ваша программа C, а не C++). – ooga

+0

Вам нужно заполнить переменную или просто распечатать ее? –

ответ

0

Вы пометили вопрос с C++ тег, хотя я не вижу ни C++ за исключением некоторых неиспользуемых заголовков. :)

Так что я написал свою показательную программу в C.

Если я правильно вам нужно понимать, что-то вроде следующего. Только я не ввел значения массива. Первоначально массив задан.

#include <stdio.h> 

#define N 3 

int main(void) 
{ 
    int a[N][N] = 
    { 
     { 1, 2, 3 }, 
     { 4, 5, 6 }, 
     { 7, 8, 9 } 
    }; 
    size_t i; 

    for (i = 0; i < N; i++) 
    { 
     size_t j; 
     for (j = 0; j < N; j++) printf("%d ", a[i][j]); 
     printf("\n"); 
    } 

    printf("\n"); 

    int tmp = a[0][0]; 

    for (i = 1; i < N; i++) a[0][i-1] = a[0][i]; 
    for (i = 1; i < N; i++) a[i-1][N-1] = a[i][N-1]; 
    for (i = 1; i < N; i++) a[N-1][N-i] = a[N-1][N-i-1]; 
    for (i = 1; i < N - 1; i++) a[N-i][0] = a[N-i-1][0]; 
    a[N-i][0] = tmp; 

    for (i = 0; i < N; i++) 
    { 
     size_t j; 
     for (j = 0; j < N; j++) printf("%d ", a[i][j]); 
     printf("\n"); 
    } 

    return 0; 
} 

Выход

1 2 3 
4 5 6 
7 8 9 

2 3 6 
1 5 9 
4 7 8 

Если это то, что вам нужно, то вы можете изменить программу в соответствии с вашими требованиями. :)

+0

Спасибо: D сделаю. – Setzo

0

Это сделает работу без необходимости хранить всю матрицу. (Замените nextNum, если вы читаете цифры):

int main() { 
    int m;  // # of matrices to read/shift/print 

    // Get # of matrices 
    m = nextNum(); 
    for (; m>0; m--) {  
     int h, w; // dimensions of matrix 
     int s1;  // value read from first column of one row to be printed in next row 
     int i, j; // index variables 
     int r[101]; // space to save a row 

     // Get matrix dimensions 
     h = nextNum(); 
     w = nextNum(); 

     // Read top-left value 
     s1 = nextNum(); 

     // Read rest of first row & print it; since we skipped 1st value, is shifted left 
     for (i=1; i<w; i++) { 
      int n = nextNum(); 
      printf("%d ", n); 
     } 

     // Process each remaining row of input 
     for (i=1; i<h; i++) { 
      int last = i==h-1 ? 1 : 0; // = 1 if last row, 0 o/w 

      // Read in the row 
      for (j=0; j<w; j++) 
       r[j] = nextNum(); 

      // Print end of it to finish off previous row; 
      // print start of next w/ value save from start of previous row 
      printf("%d\n%d ", r[w-1], s1); 

      // Print current row (if last row, include the 1st column) 
      for (j=1-last; j<w-1-last; j++) 
       printf("%d ", r[j]); 
      s1 = r[0]; 
     } 
     // Print the second-to-last item of the last row read, 
     printf("%d\n", r[w-2]); 
    } 
} 
Смежные вопросы