在2D矩阵中找到回文(水平,垂直,对角线)

时间:2017-02-26 06:58:22

标签: c multidimensional-array palindrome

我从编程拼图书中得到了这个问题陈述。我能够找到水平回文,但只有整行是回文。

我该如何实现这一目标?如何获得对角线回文? 伪代码也没问题,我只需要背后的基本逻辑。我将完成其余的工作。 谢谢。

1 个答案:

答案 0 :(得分: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>*/