2017-02-26 116 views
-1

我從一個編程益智書這個問題發言。我能夠找出水平迴文,但只有整行是迴文。查找回文以2D矩陣(水平,垂直,對角線)

我怎樣才能實現呢?又如何獲得對角迴文?
一個僞代碼也可以,我只需要這個背後的基本邏輯。我會執行其餘的。 謝謝。

+2

歡迎堆棧溢出!請說明迄今爲止的研究/調試工作。請先閱讀[問]頁面。 –

回答

1

背後尋找水平迴文訣竅是取整行,然後將其分成各個字符串。一旦完成,您需要檢查該字符串是否是迴文。對於垂直字符串,您需要爲列執行相同的操作。

現在對角的,你需要從邊緣處開始,然後向前斜(+ [1] [1]),直到你到達終點去右下角。現在繼續爲每個邊緣的每個戰術點做好準備,以幫助你獲得所有的對角線,接下來你需要做的就是拆分這些字符串,並檢查這些短字符串是否是迴文。

這將屬於動態規劃最有可能的。儘管我很困惑,但也可能會採取貪婪的方法。我會和我的教授一起確認一次。

這裏是我做回來時,我試圖解決同樣的事情的代碼 -

#define PALLEN 2 

#include <stdio.h> 
#include <string.h> 

int a[10][10]; 

/*int a[5][5] = { 
     { 1, 2, 1, 3, 5 } , 
     { 4, 5, 6, 7, 4 } , 
     { 4, 5, 5, 4, 1 } , 
     { 1, 9, 2, 1, 4 } , 
     { 1, 9, 4, 1, 5 } 
};*/ 
int n=0; 

void checkPalindrome(char*); 
void diagonalPal(); 
void stringSpliter(char*); 

int main() { 

    int i, j, k, l, x; 
    int c = 0; 
    int jmp; 
    int ptr = 0; 

    int diag; 

    char recycler[20]; 
    char diaglist[25]; 
    char revdiaglist[25]; 

    system("cls"); 

    printf("\nEnter the dimension (n) of this square matrix i.e. (n*n) - "); 
    scanf("%d", &n); 

    printf("\nNow enter the elements for this %d*%d matrix - ", n,n); 
    for(i=0;i<n;i++) 
     for(j=0;j<n;j++) 
      scanf("%d", &a[i][j]); 



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


    printf("\nHorizontal Palindromes"); 
    for (i = 0; i < n; i++) { 
     for (j = n-1, k = PALLEN; j > 0; j--, k++) { 
      while (c < j) { 
       jmp = c; 
       memset(recycler, 0, 20); 
       ptr = 0; 
       for (l = 0; l < k; l++) { 
        recycler[ptr] = a[i][jmp]; //0,0 -- 0,1 
        ptr++; 
        jmp++; 
       } 
       checkPalindrome(recycler); 
       c++; 
      } 
      c = 0; 
     } 

    } 

    printf("\n\nVertical Palindromes"); 
    for (i = 0; i < n; i++) { 
     for (j = n-1, k = PALLEN; j > 0; j--, k++) { 
      while (c < j) { 
       jmp = c; 
       memset(recycler, 0, 20); 
       ptr = 0; 
       for (l = 0; l < k; l++) { 
        recycler[ptr] = a[jmp][i]; //0,0-- 1,0 
        ptr++; 
        jmp++; 
       } 
       checkPalindrome(recycler); 
       c++; 
      } 
      c = 0; 
     } 
    } 


    printf("\n\nDiagonal Palindromes"); 
    diagonalPal(); 

} 

void stringSpliter(char *a){ 

    int i,j,k,ptr,jmp,c=0,l; 
    int len; 
    len = strlen(a); 

    char recycler[20]; 

    for (j = len-1, k = PALLEN; j > 0; j--, k++) { 
     while (c < j) { 
      jmp = c; 
      memset(recycler, 0, 20); 
      ptr = 0; 
      for (l = 0; l < k; l++) { 
       recycler[ptr] = a[jmp]; //0,0 -- 0,1 
       ptr++; 
       jmp++; 
      } 
      checkPalindrome(recycler); 
      c++; 
     } 
     c = 0; 
    } 

} 

void diagonalPal(){ 

    int i, x=0, j, k, ptr=0; 
    char diagrecycler[20]; 

    for(i = 0; i < n; i++){ 

     memset(diagrecycler, 0, 25); 
     ptr = 0; 
     for(j = i, k = 0; j < n, k < n; j++, k++){ 
      diagrecycler[ptr++] = a[j][k]; 
     } 
     stringSpliter(diagrecycler); 
    } 

    for(i = 1; i < n; i++){ 

     memset(diagrecycler, 0, 25); 
     ptr = 0; 
     for(j = 0, k = i; j < n, k < n ;j++, k++){ 
      diagrecycler[ptr++] = a[j][k]; 
     } 

     stringSpliter(diagrecycler); 
    } 

} 


void checkPalindrome(char *string){ 

    int isPalindrome = 1, i=0; 
    char rev[20]; 

    strcpy(rev, string); 
    strrev(rev); 

    isPalindrome = strcmp(rev, string); 

    if(isPalindrome == 0){ 
     printf("\n"); 
     while(string[i]!='\0') printf("%d", string[i++]); 
    } 

} 

// Output 
/*Enter the dimension (n) of this square matrix i.e. (n*n) - 4 

Now enter the elements for this 4*4 matrix - 1 2 3 4 
5 2 1 6 
8 1 1 8 
9 5 3 2 
-1--2--3--4- 
-5--2--1--6- 
-8--1--1--8- 
-9--5--3--2- 

Horizontal Palindromes 
11 
8118 

Vertical Palindromes 
22 
11 
3113 

Diagonal Palindromes 
121 
212 
G:\Code snippets\C programmes>*/ 
+0

非常感謝 –