Вывести различную конформацию строки в двумерном массиве - PullRequest
0 голосов
/ 24 сентября 2011

В настоящее время я пытаюсь закодировать проект сворачивания белка в c. Где мне дадут строку 3-4 длины, скажем, BWB или BBWW ... Я должен сохранить эту строку в 2-D массиве и распечатать все возможные комбинации с этой строкой.

если длина строки равна n, длина матрицы равна 2n. и я храню 1-й элемент в центре массива.

То, что я до сих пор пробовал, таково: Я могу вывести число конформаций конкретного ввода - скажем, для 3-буквенной строки будет сгенерировано 12 комбинаций ... для 4 сгенерировано 36 комбинаций ... как это ..

так что моя 1-я буква будет в центре матрицы, затем второе слово может быть в любой позиции - вверху, слева, справа, внизу этой ... и в зависимости от этой второй трети может быть сверху, справа слева или любые 3 комбинации…

* Всего 1008 * у меня будет 12 комбинаций ..

Я пробовал много вещей до сих пор ... и все, что я пытался это

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


main()
{
    int n=3;
    //printf("enter the number of inputs:\t");
    //scanf("%d",&n);

    int i=4;
    int temp=pow((i-1),(n-2));
    int comb=i*temp;
    //printf("total number of combination is : %d",comb);

    char str[3]="ABC";
    int size=2*n;
    int p;
    char mat[size][size];
    int j,k;
    int a=size/2;
    int b=size/2;

    for(j=0;j<size;j++)
    {
        for(k=0;k<size;k++)
        {
            mat[j][k]='*';
        }
    }

    mat[a][b]=str[0];
    int q;
    int r;
    for(r=1;r<3;r++)
    {
        for(q=1;q<=4;q++)
        {
            switch(q)
            {
            case 1:a=a+1;
            break;
            case 2:a=a-1;
            break;
            case 3:b=b+1;
            break;
            case 4:b=b-1;
            break;
            }
            mat[a][b]=str[r];
        }
    }



    for(p=0;p<comb;p++)
    {
        for(j=0;j<size;j++)
        {
            for(k=0;k<size;k++)
            {
                printf("%c",mat[j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }

    printf("total number of combination is : %d",comb);

}

Я получаю вывод

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

total number of combination is : 12

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 25 сентября 2011

Вы заполняете массив один раз, а затем печатаете его 12 раз.Предположительно, вы хотите заполнить его 12 различными способами и напечатать каждый из них.

Часто проблема такого типа выполняется с помощью рекурсии:

  1. Поместите текущий символ строки ввозможная позиция, пропуская позицию, если она уже заполнена.
  2. Если это был последний символ в строке, распечатайте массив.В противном случае вернитесь к следующему символу.
  3. Удалите только что помещенный символ.
  4. перейдите к 1

Для повторяющейся функции вы, вероятно, захотитепередать текущую позицию в массиве и следующий индекс в строке.Что-то вроде

void do_next(int i, int j, int str_index)
{
    if(str_index >= strlen(str))
    {
         print_array();
         return;
    }

    if(arr[i+1][j] == '*')
    {
        arr[i+1][j] = str[str_index];
        do_next(i+1, j, str_index+1);
        arr[i+1][j] = '*';
    }
    // three similar blocks for the other positions
    // don't use "else". Each block should be executed once
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...