2014-12-04 78 views
1

我有我的IT學校任務的問題。問題是: 將陣列的框架向左轉。 輸入: 首先得到測試數(t)。然後,對於每個測試得到I和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/)作爲你的。 – 2014-12-04 19:02:29

+0

「將數組的框架置於左邊」不是一個非常精確的問題陳述。 (而你的程序是C,而不是C++)。 – ooga 2014-12-04 19:04:45

+0

你需要填寫一個變量,或者只是打印出來嗎? – 2014-12-04 19:09:10

回答

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 2014-12-04 19:31:55

0

這將做的工作W/O不必存儲整個矩陣。 (取代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]); 
    } 
}